免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 12120 | 回复: 11
打印 上一主题 下一主题

socket编程accept返回值为0,是否正常? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-30 11:45 |只看该作者 |倒序浏览
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也被关闭了。
确实有些奇怪,到底是因为什么原因导致打开文件句柄数过多呢?

我跟踪了打开的文件句柄数过多,由于目前运行的机器为:HP-UX XTtest02 B.11.11 U 9000/800 2232404678 unlimited-user license 不支持pfiles和pstack命令,因此暂无法看到其真正打开的句柄数为文件句柄还是socket句柄。但是使用netstat 看端口的连接数一直维持在固定几个数目,因此基本排除socket未关闭的情况。
我将程序放到HP-IA运行,client端连接后即断开,连续测试三天大约连接过三万多次(client连接上server后数据收发完毕会马上关闭socket),socket的连接使用pfiles看打开的文件句柄数稳定维持在15个左右(跟进程刚开始启动时相同),pstack看进程打开线程数大约维持在5个左右(跟进程刚开始启动时相同),netstat看端口连接数一直在固定7-8,而且只有一会TIMEWAIT状态,很快就会被系统资源回收,都是正常状态。不过在HP-IA上运行也存在accept返回值为0的情况,期间看程序运行日志,数据可以正常接收,运行过程也正常,但是并未出现打开句柄说过多及“Socket operation on non-socket”错误。程序还在继续运行再观察一段时间。
不知道是不是因为HP-UX XTtest02 B.11.11 U 9000/800 2232404678 unlimited-user license 系统版本比较低导致还是由于某些核心参数设置有问题导致。
这是我做的压力测试,不断的用client连接断开server,实际情况倒是不太可能出现三天连接三万多次的情况。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
2 [报告]
发表于 2011-11-30 12:05 |只看该作者
理论上讲,返回0是正常情况,如果有过多的文件描述符没关闭accept是返回-1的

等待高人~

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
3 [报告]
发表于 2011-11-30 13:24 |只看该作者
返回0没有错误,0来做文件描述符的,莫非你的0描述符最开始的时候被关了?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
4 [报告]
发表于 2011-11-30 13:24 |只看该作者
返回0没有错误,0来做文件描述符的,莫非你的0描述符最开始的时候被关了?

论坛徽章:
0
5 [报告]
发表于 2011-11-30 14:02 |只看该作者
返回0没有错误,0来做文件描述符的,莫非你的0描述符最开始的时候被关了?
cjaizss 发表于 2011-11-30 13:24



    报错误: Socket error 10038 - Socket operation on non-socket  的时候accept的值为负值,不过从你的话我确实得到点启发。如果出现accept为负数的情况,我是否需要将
sock = socket(AF_INET, SOCK_STREAM, 0);这个sock关闭掉,目前的情况是如果accept失败会同时关闭accept的套接字和socket的套接字。


      if(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&use, sizeof(int)));
      if(bind(sock, (struct sockaddr *)&sin, sizeof(sin)) < 0);
      if(listen(sock, 100) < 0);
               
    len = sizeof(sockaddr);
    int asock=-1;
    asock = accept(iSock, &sin, &len);
    if(asock < 0)
    {
            if(errno != EINTR)
            {
                    printf("accept failed: %s]\n",strerror(errno));
                    close(asock);
                    asock=-1;
                    shutdown(iSock,2);
                    close(iSock);
                    iSock=-1;
            }
            continue;
    }

论坛徽章:
0
6 [报告]
发表于 2011-11-30 14:04 |只看该作者
理论上讲,返回0是正常情况,如果有过多的文件描述符没关闭accept是返回-1的

等待高人~
koolcoy 发表于 2011-11-30 12:05



    报错误: Socket error 10038 - Socket operation on non-socket  的时候accept的值为负值。accept的值为0是看数据都是正常接收数据的。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
7 [报告]
发表于 2011-11-30 14:08 |只看该作者
windows?那你查查手册吧

论坛徽章:
0
8 [报告]
发表于 2011-11-30 14:16 |只看该作者
回复 7# cjaizss

UNIX平台,我想问一下你所说的“前面的0描述符被关闭了”这个0描述符是哪里来的?是我们程序申请到的吗?0描述符不是stdin吗?如果会被我的程序给关闭?

论坛徽章:
0
9 [报告]
发表于 2011-12-05 11:02 |只看该作者
观察了几天,没有再出现句柄数过多的问题。accept值为0属于正常情况,数据可以正常收发,并且没有影响到其他应用。自己结贴。

论坛徽章:
0
10 [报告]
发表于 2011-12-05 13:17 |只看该作者
回复 9# cicy821@126.com

*nix类操作系统的fd有一个特性就是当open/socket/accept这种返回(文件)描述符操作会自动选择最小的返回,比如你在普通情况下打开一个文件,那么其fd应该是2,因为0-stdin,1-stdout,
当你前面有关系stdin,stdout的时候就会返回0,1这种给你。这个可以实现重定向输出。《Unix高级编程》里面貌似有讲
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP