Socket 共用一个port的问题

解决UDP收发包共用port问题的创新方法
文章详细记录了解决UDP收发包共用同一端口导致接收失败的技术难题,通过修改recvfrom返回的远程地址端口号并调整客户端socket绑定端口策略,实现了高效的数据传输。同时分享了在遇到bind权限问题时使用SO_REUSEADDR属性的失败经历,最终采用巧妙的方法解决了问题。

  今天做project,遇到一个很有意思的问题。

  首先客户端向服务端发出一个请求包,包里包含mode, packet num,packet size,rate 等参数。服务端根据这些参数,向客户端建立TCP或者UDP 并发包。

  一开始,由于想要直接使用UDP recvfrom(receiverSocket, recvbuf, recvbuflen, 0, (sockaddr *)&remoteAddr, &nAddrLen) 函数中的remoteAddr拿来做客户端的地址,然后向这个地址发包。但是发现,客户端那边无法正常接收。debug之后发现是,客户端里我接收的socket和之前发送请求包的socket无法共用一个地址(确切的说是port number)。可是我明明已经在发送完请求包后就关闭了负责发送的socket。网上查了之后,知道了即使关闭了socket,OS会默认保留这个port一段时间。蛋疼~~~

  于是,搜索了一些方法,网上有大神提出,使用SO_REUSEADDR 属性

   setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &flag, len

具体代码见:http://blog.youkuaiyun.com/liusujian02/article/details/1944520 

  但是很不幸,我使用了这种方法后,bind的过程,程序提示10013错误,就是没有权限进行bind。具体原因不清楚(我猜还是这个方法没起作用,或者是OS设置了其他限制)。无奈,最后索性放弃了共用一个port的想法。

  (如果有读者也遇到类似问题,但是成功解决了麻烦告诉我一下!多谢~)

···

最后,我选择使用一个更鸡贼的办法——在recvfrom()中得到的remoteAddr里,我将remoteAddr.sin_port++,在客户端那边设置receiving socket绑定的port number为sending socket的port经过htons()函数处理后加1的数字。问题就这么愉快的解决了,晚安!~~~(不过我还是挺想知道怎么能快速释放一个socket绑定的port)

  

转载于:https://my.oschina.net/Bruce370/blog/381104

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值