返回信息流Linux环境下。
accept等待客户端连接。
if((new_fd = accept(sockfd, (struct sockaddr *)(&client_addr),(socklen_t *) &sin_size) )== -1)
标准的accept代码,一直用的这个。
然后send了一下,errno报错:对不存在的套接字进行操作。
printf看一眼sockfd是3,正常。new_fd,居然是0.
所以调用send的时候屏幕居然打印了send的数据,我还纳闷呢以前没见过这个。
也就是说accept新建立的套接字和标准套接字重叠了。但程序之前调用printf都正常,绝对没有close(0)。
所以此时send(new_fd,...)相当于printf,客户端一直收不到数据。
请教各位什么情况下accept会返回一个0套接字。
这是一条镜像帖。来源:北邮人论坛 / cpp / #88512同步于 2015/9/8
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【网络编程】accept返回0!
wyliewylie
2015/9/8镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
【 在 wyliewylie 的大作中提到: 】
: Linux环境下。
: accept等待客户端连接。
: if((new_fd = accept(sockfd, (struct sockaddr *)(&client_addr),(socklen_t *) &sin_size) )== -1)
: ...................
0也不是错吧,stdin的fd就是0。是不是你的程序没有标准输入呢?
0不是错。所以说我的send函数莫名其妙实现了printf的功能,但我需要的功能是给客户端发消息。
这个发消息的功能一直没有实现,非常着急。
结果发现是之前有乱kill的动作,可能那时关闭了标准输入。
【 在 nuanyangyang 的大作中提到: 】
:
: 0也不是错吧,stdin的fd就是0。是不是你的程序没有标准输入呢?
printf()->fprintf(stdout, )->write(0, )->send(0, ) 就是往fd=0的“文件”里写入;一般程序启动后首先就打开控制终端,也就是0=屏幕了;
accept()能返回0,应该有close(0)操作吧,不然0会一直被占用的,不可能重新分配给socket;不理解kill怎么能关闭运行中进程的标准输入……
【 在 wyliewylie 的大作中提到: 】
: 0不是错。所以说我的send函数莫名其妙实现了printf的功能,但我需要的功能是给客户端发消息。
: 这个发消息的功能一直没有实现,非常着急。
: 结果发现是之前有乱kill的动作,可能那时关闭了标准输入。
可能是设备里有管理套接字的守护,我把服务恢复后重连,listen套接字是3,accept返回套接字是4,就很正常了。
【 在 BTup 的大作中提到: 】
: printf()->fprintf(stdout, )->write(0, )->send(0, ) 就是往fd=0的“文件”里写入;一般程序启动后首先就打开控制终端,也就是0=屏幕了;
: accept()能返回0,应该有close(0)操作吧,不然0会一直被占用的,不可能重新分配给socket;不理解kill怎么能关闭运行中进程的标准输入……