我正在尝试使用c socket prog创建接受多个客户端的服务器。但很多时候,当客户端连接时,sockfd=accept()
返回0(零),即stdin
fd。
据我所知,文件描述符返回未使用的最小值,因此可能返回0。但是当我试着听sockfd(0)或send()
到sockfd
时,它什么都不做,两者都返回0.
我怎样才能克服这个?
我正在使用RaspberryPi Raspbian(debian)。
答案 0 :(得分:3)
POSIX上的行为是从函数返回的文件描述符是最小的可用文件描述符。如果您已关闭STDIN_FILENO
或stdin
,则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
会被返回。