回 帖 发 新 帖 刷新版面

主题:关于setsockopt的问题

现在有一个发送数据(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个回复)

沙发

捆绑地址如下:
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]

板凳

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)

结贴

我来回复

您尚未登录,请登录后再回复。点此登录或注册