首页 > 编程知识 正文

linux socket命令,linux查看socket详情

时间:2023-05-06 14:59:01 阅读:116730 作者:992

EOF的定义

EOF是文件结尾的缩写,表示“字符流”(stream )的结尾。 该“字符流”可以是文件(file )或标准输入) stdin。

以前,在学习c语言文件操作时,EOF会记住标记可以确定程序是否读到文件末尾。 例如,以下代码将文本文件中的字符输出到标准输出,并确定EOF是否读取到文件末尾:

#包含

#define FILENAME 'gdb_test.c '

int main () )

{

FILE* fd软盘

int c;

FD=fopen(filename,' r ' );

while((c=fgetc )软盘)!=EOF )

{

futc(c,stdout );

}

返回0;

}

所以,我一直很好奇EOF到底是什么。 那只是简单的常数还是特殊的文字?

EOF在/usr/include/stdio.h文件中定义。

/*文件保存器。

somethingsthroughoutthelibraryrelyonthisbeing-1.* /

#ifndef EOF

#定义Eof (-1 ) ) )。

#endif

从上述EOF的定义可以看出,EOF本质上是一个具有-1值的常数!

如何在EOF中确定程序是否已读取到文件末尾?

Linux系统的一个非常重要的思想是一切都是文件。 无论是标准输入、文件系统中的普通文本文件还是网络流,都可以将其视为文件,并可以通过read/write函数读写。 因此,根据文件类型的不同,判断是否读取到文件末尾的方法也不同,请执行以下步骤

普通文本文件

标准输入文件(stdin )。

套接字流文件

了解如何确定这三种类型的文件是否已导入到文件末尾。

普通文本文件

这里的一般文件是指平时从文件服务器可以看到的文本文件,存在于Linux内的文件系统中,文件大小是固定的。

在这样的文件的情况下,Linux系统对打开read函数的文件保持读取指针,减去该指针和文件开始位置的指针值来获得相对于文件开始位置的偏移字节数,最后求出该偏移字节数和文件开始位置的偏移字节数如果距文件开始位置的偏移字节数大于文件本身的大小,则返回EOF常量,以确定是否已读取到文件末尾

因此,使用以上方法,如果一个文件包含n个字符,则while循环的内部操作将执行n 1次。 所以,最安全的写法如下。

intc=fgetc(FP;

威廉(c!=EOF

代沟;

c=fgetc(FP );

}

if(Feof(FP ) ) {

printf((nendoffilereached.) );

} else {

printf((nsomethingwentwrong.) );

}

标准输入文件

标准输入文件(stdin )它支持外围设备的键盘输入,但在Linux系统上抽象为文件,准确地说是流文件。 这类文件与上面普通文档最大的区别是文件大小不一定,就像自来水管的进水侧,可以随时接收输入。

标准输入文件这一流的特点表明,上述比较文件大小的方法无法确定是否已读取到文件末尾。 因此,Linux系统判断标准输入文件是否被读取到文件末尾的方法是设定表示文件末尾的特殊的输入标志。 在Linux系统中,该标志是Ctrl D键,当系统捕捉到该键时,它将EOF常量返回给r read函数,以告知程序已读取到标准文件的末尾。

套接字流文件

上述两种方法不适用于套接字流文件,因为套接字流文件与标准输入文件一样是流文件,并且从网络读取数据。

那么,客户端进程如何确定服务端进程是否写了所有数据?

在套接字流中,客户端进程在使用read函数读取从远程服务端进程发送来的数据时,以阻止的方式读取I/O。 除非客户端和服务端的连接断开,否则如果服务端没有向套接字写入数据,则客户端读取操作将被阻止,直到向服务端写入新数据。

如果服务端进程关闭套接字连接,客户端将接收服务端发送的TCP协议FIN数据包,客户端进程本来将阻止等待连接

收服务端进程数据的 read函数此时就会被唤醒,返回一个值 0。这跟我们前面提到两种文件读到文件末尾返回 EOF(值为-1)的情况有点差别,所以在程序中从 socket 进行读取操作时,判断数据流结束的标志不是 -1 而是 0。

Linux中,在新的一行的开头,按下Ctrl-D,就代表EOF(如果在一行的中间按下Ctrl-D,则表示输出”标准输入”的缓存区,所以这时必须按两次Ctrl-D);Windows中,Ctrl-Z表示EOF。(顺便提一句,Linux中按下Ctrl-Z,表示将该进程中断,在后台挂起,用fg命令可以重新切回到前台;按下Ctrl-C表示终止该进程。)

那么,如果真的想输入Ctrl-D怎么办?这时必须先按下Ctrl-V,然后就可以输入Ctrl-D,系统就不会认为这是EOF信号。Ctrl-V表示按”字面含义”解读下一个输入,要是想按”字面含义”输入Ctrl-V,连续输入两次就行了。

所以,一个简单的从 socket 文件读取数据的样例代码,通常是下面这样的:

char recvline[MAX_LINE_LENGTH];

int read_count;

while ((read_count = read(sock_fd, recvline, MAX_LINE_LENGTH)) > 0)

{

printf("%sn", "String received from server: ");

fputs(recvline, stdout);

}

总结

所以,一定要记住这样一个概念:EOF 是一个常量而不是一个字符!。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。