AIX下多进程下不同线程同时绑定到一个端口导致问题

wlbfzy 2009-12-08 07:15:50
先谢过各位, 2个问题。

本程序为多进程+多线程(一个tuxedo服务程序),环境:aix 6.1 + tuxedo 。

1、问题为:多个进程下的线程同时绑定1个端口成功了(非系统自动选择,人为在一个端口范围内选择, 方法:绑定不成功,再选择下一个)。没有设置端口重用,只设置了SO_REUSEADDR。 不应该是第一个绑定成功后下一个就不能再绑定了么?

2、一个线程close掉socket后,可以 立即被别的线程bind、listen成功,但对方不能connect(客户端该函数的返回码为-1,但errno却为 0,已经加上宏了:-D_THREAD_SAFE),如果在listen后sleep 15秒,对方就可connect了,这又是怎么回事呢。

...全文
331 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wlbfzy 2009-12-16
  • 打赏
  • 举报
回复
感谢各位鼎力支持。我再把情况说明白一点。 我是要建立一个PORT方式的FTP的数据连接(所以,该连接是一对一服务),上传文件时不会有此问题,下载时才有问题的。 而且没有timewait的状态和closed状态的。而且,linger也关闭此设置,同时,如果将close改用shutdown(fd,2)来实现时,会出现大量的closed端口状态。 奇怪啊。。。
zhanxiaoxin 2009-12-11
  • 打赏
  • 举报
回复
按你的思路,你的socket服务端,是线程里面建的。。包括socket的连接,bind,listen。也是在线程里面建设的。而这种线程,又是要不断的生成和销毁。。我觉得你应该把你对每个socket连接的业务处理和socket的bind和listen,这两类业务分开。。分为一个主线程 专门去处理bind和listen,不断的监听客户的链接,当有连接来了,就去另外生成一种工作线程,让它去处理后续的业务。这是我对你的流程的建议。。要不然,服务端的线程不断的去生成再销毁,这样对客户端不太好。
独孤过儿 2009-12-09
  • 打赏
  • 举报
回复
1、第一个问题我记不清楚UNP上的原话了,于是google了一下,还真有,如下:

SO_REUSEADDR可以用在以下四种情况下。(摘自《Unix网络编程》卷一,即UNPv1)
1、当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你启
动的程序的socket2要占用该地址和端口,你的程序就要用到该选项。
2、SO_REUSEADDR允许同一port上启动同一服务器的多个实例(多个进程)。但
每个实例绑定的IP地址是不能相同的。在有多块网卡或用IP Alias技术的机器可
以测试这种情况。
3、SO_REUSEADDR允许单个进程绑定相同的端口到多个socket上,但每个soc
ket绑定的ip地址不同。这和2很相似,区别请看UNPv1。
4、SO_REUSEADDR允许完全相同的地址和端口的重复绑定。但这只用于UDP的
多播,不用于TCP。

2、第二个问题可能是由于TIME_WAIT引起的。如果客户端主动关闭了连接,那就会进入TIME_WAIT状态,这个时候再连就会报错的。
zhanxiaoxin 2009-12-09
  • 打赏
  • 举报
回复
你查下当第二个问题发生时,是不是你的那个端口有很多的close_wait?如果是的话,可能就象我上面说的那种情况。
zhanxiaoxin 2009-12-09
  • 打赏
  • 举报
回复
第一个问题,我也不是很了解,只说下我的看法,我个人觉得也应该是不能多个进程或者线程同时绑定监听一个端口(不知道你说的是绑定,是只是bind吗?还是绑定后,还listen了。)我觉得绑定是可以都绑定,但监听的话。不可能都同时监听吧。

第二个问题,那可能是你的服务端主动断开socket连接。如果你的客户端先把连接close,然后你的服务端再退出的话。那样可能你的第二个绑定该端口的socket服务端就可以立即被connect上了。
快乐田伯光 2009-12-09
  • 打赏
  • 举报
回复
1. 多个socket是可以绑定同一个端口的,如果多个socket绑定了同一个socket,那么发往这个端口的数据,所有socket都可以收到一份copy. 但这应该是对数据包套接字才合理,而流式套接字是不合理的。
2. 这可能是线程的实现原理所导致的,没有研究。等别人解释
once_and_again 2009-12-09
  • 打赏
  • 举报
回复

Unix网络编程
W.Richard Stevens 先生 的书 果然 是经典.
wlbfzy 2009-12-09
  • 打赏
  • 举报
回复
看了帖子,先谢过各位。可能表述的不是很清楚,再补充一下,

1. 多个线程同时成功bind,listen在1个端口.

2. 因为是1v1服务(不要去研究模型),所以,在1个线程close后,被别的线程成功bind,listen,这时,要connect的也是不同的客户端。

注:我是服务器。
wangqingshui531 2009-12-08
  • 打赏
  • 举报
回复
这个不懂,等高人,帮顶

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧