accept()返回" 0"零插件(stdin fd)在c socket prog

时间:2016-04-14 06:23:40

标签: c linux sockets

我正在尝试使用c socket prog创建接受多个客户端的服务器。但很多时候,当客户端连接时,sockfd=accept()返回0(零),即stdin fd。

据我所知,文件描述符返回未使用的最小值,因此可能返回0。但是当我试着听sockfd(0)或send()sockfd时,它什么都不做,两者都返回0.

我怎样才能克服这个?

我正在使用RaspberryPi Raspbian(debian)。

1 个答案:

答案 0 :(得分:3)

POSIX上的行为是从函数返回的文件描述符是最小的可用文件描述符。如果您已关闭STDIN_FILENOstdin,则0可用,并且将是connect返回的那个。

请注意,文件描述符0没有什么特别之处;它用于标准输入只是一个惯例; Linux上的accept(2)手册明确使用了 nonnegative 这个词,其中包含了返回0的可能性:

  

返回值

     

成功时,这些系统调用返回非负整数,该整数是接受套接字的描述符。 出错时,返回-1 ,并正确设置errno。

你可以通过不关闭STDIN_FILENO来避免这种情况,但是打开说/dev/null进行读取并将dup2:n这个文件描述符改为STDIN_FILENO(为简洁起见,省略了错误检查):

int fd = open("/dev/null", O_RDONLY);
dup2(fd, STDIN_FILENO);
close(fd);

(或关闭STDIN_FILENO然后立即打开/dev/null,但这有点模糊不清):

close(STDIN_FILENO);
open("/dev/null", O_RDONLY);

我不确定listen的意思;连接的TCP套接字不能 listen ed 。此外,来自0的{​​{1}}意味着您明确发送0个字节;因为错误send会被返回。