日期:2014-05-16  浏览次数:22124 次

socket编程accept返回值为0,是否正常?
socket编程server端程序接收client多连接请求后,sock = accept(iSock, &sin, &len); sock的返回值为0,多数情况下看到的返回值都是正数,出现个零很是奇怪,在这里求助下有人遇到过吗?什么情况下会返回零呢?求大虾....

再看返回了错误码:Socket error 10038 - Socket operation on non-socket 即:非法的socket对象在操作 这个原因基本定位可以给accept返回值为0原因导致。

从我的程序运行来看确实出现了:too many openfiles 这个错误,即打开文件句柄过过。但是我的程序既有打开的文件也有打开的socket,用pfiles看进程打开的句柄数却并没用什么变化。程序日志跟踪打开的文件都被及时关闭,打开的socket也被关闭了。
确实有些奇怪,到底是因为什么原因导致打开文件句柄数过多呢?



------解决方案--------------------
0 也是一个合法的描述符
如果你事先关闭了0这个描述符,然后再accept,那么很可能返回0

close(0);
int fd = accept(...);
------解决方案--------------------
探讨

0 也是一个合法的描述符
如果你事先关闭了0这个描述符,然后再accept,那么很可能返回0

close(0);
int fd = accept(...);

------解决方案--------------------
楼上2位不错,可 0 1 2 是默认给系统预留的。 如果accept使用0 作为通道, 那么其他程序会受到影响。
------解决方案--------------------
"too many openfiles"----出现这种情况,"描述符打开过多"这一点应该是可以肯定的,你再仔细检查下是否有打开但没有关闭的描述符(包括文件和socket)。ls -l /proc/"进程号"/fd/基本可以查看某一进程所打开的描述符资源,对于socket可以使用netstat命令查看,如果有未关闭的socket,那么会有大量的CLOSE_WAIT状态的连接。
或者说是你的系统的最大描述符数量被改动过了(ulimit -n查看)。
希望能帮上忙,楼主解决问题时请与大家分享下原因。(:-:)
------解决方案--------------------
很有可能返回0的时候,你的socket文件描述符已经被异常或正常关闭了.Socket operation on non-socket,提示不是socket 文件符操作了.
------解决方案--------------------
accept有返回1或2的情况不?
如果有很有可能说明你的server端进程是有守护进程的,并且你这个dameom还是位于socket和accept之间的。
------解决方案--------------------
探讨
引用:
accept有返回1或2的情况不?
如果有很有可能说明你的server端进程是有守护进程的,并且你这个dameom还是位于socket和accept之间的。


运行了6天了,目前没有再出现"too many files"这种错误。
accept值为0程序都正常运行,没有看到1和2的情况。
我的程序不是守护进程,程序未做成守护进程。

------解决方案--------------------
socket标准规定成功后accept返回非负描述符即可,错误则返回-1;

只要非负就是正常的,有什么问题吗?