在Linux当中,我们知道,每一个进程都有自己唯一的PID。而这个唯一的PID可以标识一个主机当中的唯一一个进程,今天在用modbus写通信期间遇见一个很有意思的问题。

说是有意思讲来简单,就是简单的端口占用问题,我们知道modbus是应用层的协议,但是是基于传输层的TCP协议来实现的。这就导致一个问题,当客户端连接服务器后,服务器意外终止了,此时端口会进入一个被占用的状态,服务器会等待一端时间后才会释放端口。

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

但是这个还是有一些问题的,真正的解决方案就是端口复用

用的是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当中就时后绑定的可以接受数据。

具体可以看:原文链接:https://blog.csdn.net/zhanghuaichao/article/details/105122969

端口复用·一个端口多个进程使用相关推荐

  1. 端口号 一个端口号是否可以被多个进程绑定? 一个进程是否可以bind多个端口号?

    1.端口号的作用 端口号可以用来标识同一个主机上通信的不同应用程序,端口号+IP地址就可以组成一个套接字,用来标识一个进程 2.端口号的应用场景 在TCP/IP协议中,用"源IP地址&quo ...

  2. php开启端口复用,WebServer端口复用后门

    0x00 有朋友问到了我一个关于"无端口可用"的问题.说在如下图所示的内网环境中,firewall只允许Web Server的80端口建立网络连接,并且Web Server上的80 ...

  3. java bind端口复用_bind端口复用

    所谓绑定是指别人连接我只能通过我所绑定的端口,其实是说,你现在有这个端口开放了,人家可以连接到你的服务,也可以进行数据传输,但是也不一定要使用此端口进行传输,可能此端口只用于控制信息的传输 端口 = ...

  4. STM32F1 端口复用、端口(部分和完全)重映射

    端口复用功能         STM32 有很多的内置外设(比如:串口.ADC.DAC等是独立的模块和内核连接在一起),这些外设的外部引脚都是与 GPIO 复用的.也就是说,一个 GPIO如果可以复用 ...

  5. java socket 端口复用_Socket端口复用【转】

    一.什么是端口复用: 因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分.这种多重绑定便称之为端口 ...

  6. java tcp端口复用_tcp端口复用

    Java TCP/IP协议的Socket如何设置端口复用? 情境如下: 1). 使用new Socket(ServerAddress, ServerPort, ClientAddr你的其中一端的连接没 ...

  7. STM32端口复用和端口重映射

    参考:stm32 端口复用和重映射 作者:点灯小哥 发布时间: 2021-03-09 13:49:19 网址:https://blog.csdn.net/weixin_46016743/article ...

  8. linux端口复用隐藏后门

    之前听前辈门说利用端口复用可以绕过服务端端口防护规则+进程审计,今天决定复现一下,划划水.水文一篇,表哥莫怪! 首先检查实验主机 192.168.246.131 端口,可以看到22端口是开着的,80端 ...

  9. stm32之端口复用和重映射

    文章目录 端口复用 端口重映射 端口复用 WHAT IS 端口复用? 一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用 端口复用配置过程(以串口1位例 ...

最新文章

  1. Integer to Roman 问题
  2. Beta阶段事后分析
  3. 016_泛型常见通配符
  4. APR-Util 1.5.1 发布
  5. EV3 直接命令 - 第 2 课 让你的 EV3 做点什么
  6. 【ESSD技术解读-04】ESSD Auto PL规格,引领IO性能弹性新方向
  7. Apache Spark Jobs 性能调优(一)
  8. MTK 驱动开发(17)---LCD MIPI
  9. 微信小程序第三方平台和附近的小程序将开放
  10. 配置Tomcat 域名解析 tomcat/conf server.xml
  11. JavaWeb框架梳理
  12. 7种不同的数据标准化(归一化)方法总结
  13. html页面调节图片大小,怎么用css设置图片大小?
  14. 【20CSPS提高组】动物园
  15. 论文阅读|Pre-trained Models for Natural language Processing: A Survey
  16. strictmath_Java StrictMath cbrt()方法与示例
  17. 使用torchvision时报错:ModuleNotFoundError: No module named ‘six‘
  18. 如何拆台式计算机光驱,如何拆开光驱
  19. 销售数据的多维度交叉分析
  20. android 6g 有必要吗,Android手机: 6G和8G运行内存之间有多大差异?网民: 做这些事有区别...

热门文章

  1. dynamic proposa
  2. 【原创】医鹿APP九价HPV数据抓包分析
  3. Upstart 将被放弃,Ubuntu 投入 Systemd 怀抱
  4. matlab rgb2gray的实现
  5. Github打不开解决方法
  6. 使用Moya封装上传带参数的文件
  7. CentOS 6 安装 Nvidia 显卡驱动
  8. 数据拉取之xxl-job+工厂模式+token实现拉取(三)
  9. 006. esp32 下载--第二版
  10. java调用短信接口实现发送短信