Chinaunix

标题: 请问两个socket能否绑定在同一端口上? [打印本页]

作者: gabbar    时间: 2006-07-31 10:52
标题: 请问两个socket能否绑定在同一端口上?
我想写一个程序,利用socket接口收发UDP数据报。想用两个socket,一个用来发包,一个用来接收,我想把两个socket绑定在同一个端口上,不知道这样可不可以,会不会冲突?请高手指教。
作者: flw    时间: 2006-07-31 10:53
应该可以吧。
作者: xiao_cui2000    时间: 2006-07-31 10:55
应该不能吧?bind不会失败嘛?
作者: isnowran    时间: 2006-07-31 11:05
如果是同一个网卡上会有冲突,把相同端口绑定在不同的网卡上就行了
作者: fibbery    时间: 2006-07-31 11:06
应该是可以,但是不叫两个socket,应该是一个,因为,现在是全双工的,通过一个端口即可以发送也可以接受。
作者: zhhui2000    时间: 2006-07-31 11:16
肯定不行了,发给谁?谁接收?(猜想,没验证)
作者: anhongkui    时间: 2006-07-31 11:19
一个socket是由4部分组成,sip, sport, dip, dport
只要这四个里有一个不同就可以。

所以可以把两个socket绑定在一个端口上,但是要保证对方的ip或port不一样

像楼主这种情况,不行。
作者: playmud    时间: 2006-07-31 11:43
用一个socket不就能收发了吗?
作者: linuxiang    时间: 2006-07-31 11:56
两个相同的socket绑定在同一端口是不行的,假如一个tcp,一个udp的就可以
像楼主这种情况完全可以用一个socket解决
作者: wz_uestc    时间: 2006-07-31 13:43
原帖由 anhongkui 于 2006-7-31 11:19 发表
一个socket是由4部分组成,sip, sport, dip, dport
只要这四个里有一个不同就可以。

所以可以把两个socket绑定在一个端口上,但是要保证对方的ip或port不一样

像楼主这种情况,不行。



正解!!!
作者: flw    时间: 2006-07-31 14:08
刚才试过了,是可以的。
只要指定了 SO_REUSEADDR 就没问题了。
作者: anhongkui    时间: 2006-07-31 14:42
第二个socket在connect处失败

想了半天,还是不明白

楼上的,怎么试验的你?

[ 本帖最后由 anhongkui 于 2006-7-31 14:48 编辑 ]
作者: flw    时间: 2006-07-31 14:51
原帖由 anhongkui 于 2006-7-31 14:42 发表
第二个socket在connect处失败

想了半天,还是不明白

楼上的,怎么试验的你?

UDP 好像不用 connect 吧?
作者: anhongkui    时间: 2006-07-31 14:52
原帖由 flw 于 2006-7-31 14:51 发表

UDP 好像不用 connect 吧?


小学就有的毛病,看题不仔细,经常吃亏
作者: flw    时间: 2006-07-31 15:03
我把我刚才写的例子放在这里了:
http://svn.perlchina.org/trunk/member/flw/c/demos/socket/udp/
作者: anhongkui    时间: 2006-07-31 15:24
又尝试了

的确是可以的

不过,不用SO_REUSEADDR 也可以绑定成功,也许是UDP的特性吧
作者: flw    时间: 2006-07-31 15:27
原帖由 anhongkui 于 2006-7-31 15:24 发表
又尝试了

的确是可以的

不过,不用SO_REUSEADDR 也可以绑定成功,也许是UDP的特性吧

哦?
可是我这里第二次绑定时如果不用 SO_REUSEADDR 就会报“Address already in use”的错误,你是什么系统?
作者: anhongkui    时间: 2006-07-31 15:32

  1. [anhk@localhost test]$ uname -a
  2. Linux localhost.localdomain 2.4.20-8smp #1 SMP Thu Mar 13 17:45:54 EST 2003 i686 i686 i386 GNU/Linux
  3. [anhk@localhost test]$ ulimit
  4. unlimited
  5. [anhk@localhost test]$
复制代码

天知道是什么系统
作者: anhongkui    时间: 2006-07-31 15:35
我在debian下,用signal中断sleep,然后该进程运行就错误了,在这个系统上,什么问题都没有
稳定死我了

经常出错的地方,在这个系统上运行,也没错
作者: mike_chen    时间: 2006-07-31 15:44
原帖由 anhongkui 于 2006-7-31 15:24 发表
又尝试了

的确是可以的

不过,不用SO_REUSEADDR 也可以绑定成功,也许是UDP的特性吧


不用SO_REUSEADDR应该是不行吧 即使只有一个程序用这个端口 如果结束后马上重启可能也会报“Address already in use”错误 原因是因为操作系统还没有及时释放该端口 所以我在所有的socket程序里都指定了SO_REUSEADDR 这个选项
作者: anhongkui    时间: 2006-07-31 15:48
在我的这个机器上,TCP不用SO_REUSEADDR选项是不行的,UDP却是可以的
作者: gabbar    时间: 2006-07-31 18:15
谢谢各位老大指教,小弟非常感动。
其实老板让我作的程序是这样的:
在一台主机上,利用UDP端口和局域网内的其他主机通信,但收发都使用同一个端口。
小弟是新手,就想到能不能用两个socket绑定在同一个端口上。后来想想,似乎可以
用同一个socket实现双工通信,但我的疑虑是网络上发来的数据报是异步的,所以一
直要用recvfrom()阻塞接收,但如果在recvfrom()未返回时需要发送数据,此时socket
会将报文成功发送出去吗,还是一定要等待recvfrom()返回后才发送呢?
作者: cjaizss    时间: 2006-07-31 18:36
原帖由 flw 于 2006-7-31 14:51 发表

UDP 好像不用 connect 吧?

UDP不connect的话,效率何在?
另外,bind如果连一个端口都不可以绑定在不同的socket上,那TCP/IP的功能也太差了
作者: zhhui2000    时间: 2006-07-31 18:49
绑定成功了,收发有问题吗?发来一个消息,任何一个进程收就可以了?
作者: 默难    时间: 2006-07-31 19:40
原帖由 gabbar 于 2006-7-31 18:15 发表
谢谢各位老大指教,小弟非常感动。
其实老板让我作的程序是这样的:
在一台主机上,利用UDP端口和局域网内的其他主机通信,但收发都使用同一个端口。
小弟是新手,就想到能不能用两个socket绑定在同一个端口上 ...

你这个问题可以有以下几个方案:
1 使用多路复用。你可以看看有关select poll的信息,如果是Linux下,那么可以看一下epoll
2 使用非阻塞(non-blocking)模式。你可以搜索一下相关信息
3 使用多路复用+非阻塞模式。就是把上面两个东西合起来一起用
4 使用多线程。pthread相关的信息,你可以看看

这些问题在W. Richard Stevence的UNP(UNIX Network Programming. UNIX网络编程,目前最新版是第三版)里面有描述。
作者: Bayweb    时间: 2006-07-31 22:50
原帖由 gabbar 于 2006-7-31 10:52 发表
我想写一个程序,利用socket接口收发UDP数据报。想用两个socket,一个用来发包,一个用来接收,我想把两个socket绑定在同一个端口上,不知道这样可不可以,会不会冲突?请高手指教。

>>
>>
>>建议参考TFTP
>>
>>
作者: gabbar    时间: 2006-08-01 13:13
谢谢各位了!!!
作者: vivian9820    时间: 2006-08-01 15:07
sctp可以
作者: dlms    时间: 2006-08-01 17:16
我记得好像用select也可以吧




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2