主题:关于setsockopt的问题
overfly
[专家分:3230] 发布于 2010-04-06 15:57:00
现在有一个发送数据(send)和一个接收数据的程序(recv),send程序可以指定发送IP和端口,数据使用UDP发送,recv程序可以指定端口。现在想达到一种效果:send程序指定IP和端口后发送数据,在对应IP上同时打开两个以上recv程序并指定相同端口,两个recv程序都能接收到send程序发送的数据,实现方法如下:
recv程序
BOOL optval = TRUE;
setsockopt(m_sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&optval, sizeof(optval));
int ret = bind(m_sock,(SOCKADDR*)&seraddr,sizeof(SOCKADDR));
在实际运行过程中会出现如下问题,如果send程序是以广播形式发送数据的话,多个recv程序都可以接收到数据;如果send程序指定IP的话,多个recv程序只有最先打开的那个能接收到数据,这是怎么回事?如何改成send程序指定IP多个recv也能同时收到数据?
回复列表 (共2个回复)
沙发
overfly [专家分:3230] 发布于 2010-04-06 16:13:00
捆绑地址如下:
SOCKADDR_IN seraddr;
seraddr.sin_addr.s_addr = htonl(INADDR_ANY);
seraddr.sin_family=AF_INET;
seraddr.sin_port=htons(nPort);
BOOL optval = TRUE;
setsockopt(m_sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&optval, sizeof(optval));
int ret = bind(m_sock,(SOCKADDR*)&seraddr,sizeof(SOCKADDR));
牛仔兄快来看看[em10]
板凳
overfly [专家分:3230] 发布于 2010-04-06 16:55:00
SO_REUSEADDR可以用在以下四种情况下。
摘自《Unix网络编程》卷一
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。
7) SO_REUSEADDR 和 SO_REUSEPORT:
SO_REUSEPORT是一些系统对SO_REUSEADDR的补充。但是,一般就用SO_REUSEADDR,它虽然是写的ADDR,但是是对IP和端口都有效的。说的就是,可以重用端口,地址到不同的套接口!! 看系统实现,可能绑定相同的端口需要不同的IP,也可能在UDP情况下,完全重复的端口和IP也可以给另一个套接口。 来了数据怎么发送?──通配地址的优先权最低!这就是潜在的问题:对于非特权端口,恶意用户绑定后,就能截取数据。解决办法是,如果是非特权端口,不要bind通配地址。另外,外来数据在多播情况下,可以送达所有的套接口,如果是单播,送到哪个重复的套接口是不一定的。(http://hi.baidu.com/00%C6%F3%B6%EC/blog/item/34ed2319832b674242a9add4.html)
结贴
我来回复