unix 与 windows 有关socket 资源 释放的区别???

发表于:2007-06-08来源:作者:点击数: 标签:
本人在编成中客户端采用短连接的方式与Server进行socket连接,当server与client均在 windows xp下运行时每秒5个并发 测试 不成问题,但当把客户端放在hpux下运行时却只能有每秒1个的处理能力,当加大压力时(每秒4个)这时客户端在connect时返回错误代码9表

本人在编成中客户端采用短连接的方式与Server进行socket 连接,当server与client 均在windows xp下运行时每秒5个并发测试不成问题,但当把客户端放在hpux 下运行时却只能有每秒1个的处理能力,当加大压力时(每秒4个)这时客户端在connect 时返回错误代码 9 表示 is not a valid file descriptor.对于这种情况,本人以为是windows与unix下socket 资源释放时间有关系。但具体如何解决却一筹莫展(不想改成长连接的方式)。

 albert 回复于:2002-07-19 14:55:14
你能把UNIX系统的具体返回的错误信息贴出来吗?

 jazy 回复于:2002-07-19 15:54:09
albert 你好,谢谢你看到这个帖子,其实具体的系统资源的错误信息我还不知道如何去查看,只是在客户端程序中对connect执行的错误码进行了判断:
 int rc;
 rc = pClient->Connect(m_BillAddr,m_BillPort);

发现在每秒之行5个socket 请求时大概执行了几百个请求后开始出现rc值为9的情况。

不知道这种情况该如何定位问题所在?

望不吝赐教!!谢谢!!


 albert 回复于:2002-07-19 16:18:44
你的程序是C写的? 我编程不在行。我可能只能从操作系统级帮你分析一下,你在运行到几百个请求时在HPUX下执行 netstat -a 观察一下是否你需要建立的连接有多少,注意一下它们的状态是什么。

 jazy 回复于:2002-07-22 18:04:28
用netstat -a 发现大概有50个连接(在服务端的监听端口上),这种情况在后来测试发现具体的问题如下:

    当客户端不断与服务端建立连接后又断开时,过一段时间后会出现客户端无法对服务端的应答作反应,即不会再触发receive。

 albert 回复于:2002-07-22 19:21:31
不好意思,我现在正在干一些我很不愿意干但又没法不干的工作,停不下来,我明天再帮你看吧。

 fdlj53u 回复于:2002-07-23 09:59:13
我觉得是unix 下的文件描述字消耗完了。看看有没有关闭文件描述符。

 jazy 回复于:2002-07-23 12:56:41
关闭操作肯定是做了,但是是否及时关闭就不知道了,因为在我的操作里需要频繁的进行连接、关闭操作。unix 的file descriptor 定义的是多少,能否设大些,又该如何配呢?

 albert 回复于:2002-07-23 16:09:57
jazy, Have you use any system function in the customized function :      pClient->Connect(m_BillAddr,m_BillPort); I think you should check the
meaning of the return error code of the system call.(rc=9)
Sorry, I am afraid I can not help you more about this question owing to 
my limited knowledge. 


 jazy 回复于:2002-07-23 19:28:18
这方面的资料也查找过了,但目前此问题还是没有解决,而且问题的出现情况还可以进一步具体到当连续进行了53次短连接(连接后发包完毕,立刻关闭连接)后,从第54次开始就无法收到应答包了。真真觉得很奇怪!!!!

albert ,非常感谢你的帮助!!!



 jazy 回复于:2002-07-23 21:28:20
问题似乎解决了。原因是HPUX系统在创建线程是采用POSIX标准,在执行
rc=pthread_create(&m_ThreadId,&attr,start_address,arglist);
时,要注意设定&attr属性,该参数默认为NULL,为join方式,而在后面并为进行pthread_join操作进行线程合并以释放资源,从而造成大量的leap,后来的处理是采用
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);采用detach的方式创建线程,这样,在线程结束时,系统将自动释放资源。

出现这种问题就涉及到不同操作系统的标准不同,这种情况在solaries系统好像不会发生。



 albert 回复于:2002-07-23 23:52:42
Congratulations! Jazy,that's great. 
This question is really difficult and teach me more.
Thanks. 
Let us make our forum more populated together!

 bluespace 回复于:2002-07-25 19:21:04
greate!you can use 'glance' to check resource usage.

原文转自:http://www.ltesting.net