当前位置: 技术问答>linux和unix
socket编程accept返回值为0,是否正常?
来源: 互联网 发布时间:2017-01-22
本文导语: socket编程server端程序接收client多连接请求后,sock = accept(iSock, &sin, &len); sock的返回值为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也被关闭了。
确实有些奇怪,到底是因为什么原因导致打开文件句柄数过多呢?
再看返回了错误码: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这个描述符,然后再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查看)。
希望能帮上忙,楼主解决问题时请与大家分享下原因。(:-:)
或者说是你的系统的最大描述符数量被改动过了(ulimit -n查看)。
希望能帮上忙,楼主解决问题时请与大家分享下原因。(:-:)
|
很有可能返回0的时候,你的socket文件描述符已经被异常或正常关闭了.Socket operation on non-socket,提示不是socket 文件符操作了.
|
accept有返回1或2的情况不?
如果有很有可能说明你的server端进程是有守护进程的,并且你这个dameom还是位于socket和accept之间的。
如果有很有可能说明你的server端进程是有守护进程的,并且你这个dameom还是位于socket和accept之间的。
|
贴个代码看看,有点奇怪
|
socket标准规定成功后accept返回非负描述符即可,错误则返回-1;
只要非负就是正常的,有什么问题吗?
只要非负就是正常的,有什么问题吗?