毫米波雷达集成测试问题——多进程绑定一个udp端口不能同时收发数据

结论:socketcan多进程绑定一个口可以同时收发数据,而且不丢数据,因为can是广播;udp不能,开了端口复用选项(SO_REUSEADDR)也不能同时收发数据!!!

        一个端口能被多个进程使用的情况,按道理来说这个是行不通的,但是这个实现其实是,一个端口上可以运行许多个进程,每个进程都可以调用同一个端口,但是当有一个进程在占用该端口时,其他进程会等待,等前一个进程释放该端口后才可以由下一个进程调用。问题就出在占用问题之上。只要程序不是一直占用这个端口,这就可以重复使用这个端口。

        但是这个还是有一些问题的,真正的解决方案就是端口复用用的是setsockopt函数,设置应用层,启用端口复用函数来实现,端口复用的使用是有一些注意的,受限端口的绑定得要在read,write函数之前进行绑定,因为在发送信息函数( sendto, 或 write ),系统会自动给当前网络程序分配一个随机端口号,这相当于随机绑定了一个端口号,这里只会分配一次,以后通信就以这个随机端口通信,我们再绑定端口号的话,就会绑定失败。如果我们放在发送信息函数( sendto, 或 write )之前绑定,那样程序将以我们绑定的端口号发送信息,不会再随机分配一个端口号。所以端口复用函数要在绑定之后进行。

        SO_REUSEADDR可以用在以下四种情况下。 (摘自《Unix网络编程》卷一,即UNPv1)

        1、当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你启动的程序的socket2要占用该地址和端口,你的程序就要用到该选项。

        2、SO_REUSEADDR允许同一port上启动同一服务器的多个实例(多个进程)。但每个实例绑定的IP地址是不能相同的。在有多块网卡或用IP Alias技术的机器可以测试这种情况。

        3、SO_REUSEADDR允许单个进程绑定相同的端口到多个socket上,但每个socket绑定的ip地址不同。这和2很相似,区别请看UNPv1。

        4、SO_REUSEADDR允许完全相同的地址和端口的重复绑定。但这只用于UDP的多播,不用于TCP。

        需要注意的是,设置端口复用函数要在绑定之前调用,而且只要绑定到同一个端口的所有套接字都得设置复用

        端口复用允许在一个应用程序可以把 n 个套接字绑在一个端口上而不出错。同时,这 n 个套接字发送信息都正常,没有问题。但是,这些套接字并不是所有都能读取信息。这就涉及到复用当中的一些问题,

        绑定时都可以绑定的,但是在接受消息方面又其他的结论:

        1.如果两个进程都绑定的是本地的真实ip,如 ip addr.sin_addr.S_un.S_addr = inet_addr("10.110.12.68");

        那谁先绑定谁就可以收到数据。后面虽然可以绑定,但是收不到发送过来的数据。

        2.如果两个进程一个绑定的是INADDR_ANY,而一个绑定的是真实ip,那么最终收到数据的是真实ip,如果两者都是绑定的真实ip,在Linux当中就是后绑定的可以接受数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值