+ -
当前位置:首页 → 问答吧 → socket编程accept返回值为0,是否正常?

socket编程accept返回值为0,是否正常?

时间:2011-11-29

来源:互联网

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也被关闭了。
确实有些奇怪,到底是因为什么原因导致打开文件句柄数过多呢?

作者: cicy821   发布时间: 2011-11-29

0 stdin 1 stdout 2 stderr 如果accept返回是0 1 或2 是不正常的

作者: luoyaojun000   发布时间: 2011-11-29

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

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

作者: justkk   发布时间: 2011-11-29

引用 2 楼 justkk 的回复:

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

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


++。

作者: qq120848369   发布时间: 2011-11-29

楼上2位不错,可 0 1 2 是默认给系统预留的。 如果accept使用0 作为通道, 那么其他程序会受到影响。

作者: luoyaojun000   发布时间: 2011-11-29

"too many openfiles"----出现这种情况,"描述符打开过多"这一点应该是可以肯定的,你再仔细检查下是否有打开但没有关闭的描述符(包括文件和socket)。ls -l /proc/"进程号"/fd/基本可以查看某一进程所打开的描述符资源,对于socket可以使用netstat命令查看,如果有未关闭的socket,那么会有大量的CLOSE_WAIT状态的连接。
或者说是你的系统的最大描述符数量被改动过了(ulimit -n查看)。
希望能帮上忙,楼主解决问题时请与大家分享下原因。(:-:)

作者: StoneBBS   发布时间: 2011-11-29