socket端口复用之TCP和UDP

这篇具有很好参考价值的文章主要介绍了socket端口复用之TCP和UDP。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.什么是端口复用?

2.多个socket可以绑定同一个端口吗?

3.绑定同一端口的多个套接字如何接收数据?

4.SO_REUSEADDR和SO_REUSEPORT选项设置

5.SO_REUSEADDR和SO_REUSEPORT在实际中的运用?

5.1 解决TCP套接字处于TIME_WAIT状态占用端口号问题。

5.2 程序重启后后,端口未释放导致程序重启异常。


1.什么是端口复用?

端口复用是指多个套接字绑定到同一个端口,多个套接字绑定同一个端口会涉及到多个套接字的竞争关系和合作关系。

socket端口复用,Linux网络编程,tcp/ip,网络,c语言,linux,物联网

 图 1 端口复用

竞争关系:可以理解为哪些套接字能绑定这个端口,哪些套接字则不能绑定这个端口。

合作关系:可以理解为怎样才能让更多的套接字绑定这个端口,哪些套接字有优先权等。

2.多个socket可以绑定同一个端口吗?

多个套接字默认情况是不可以绑定同一个端口。

设置过套接字选项(SO_REUSEADDR,SO_REUSEPORT)的套接字可以在某些情况下绑定同一个套接字,可以从UDP和TCP两种情况去讨论:

  • UDP情况

情况1:两个套接字只要源IP地址不一样,可以绑定同一个端口,不管SO_REUSEADDR和SO_REUSEPORT设置为多少都一样。

情况2:两个套接字源IP地址相同,如果两个套接字SO_REUSEADDR或者SO_REUSEPORT都设置为1,可以绑定同一个端口。

情况3:两个套接字源IP地址相同,除了情况2可以绑定同一个端口,其他情况都不能绑定同一个端口,通常第二个套接字会提示bind错误。

  • TCP 情况

情况1:两个套接字只要源IP地址不一样,可以绑定同一个端口,不管SO_REUSEADDR和SO_REUSEPORT设置为多少都一样。

情况2:两个套接字源IP地址相同,只要有一个套接字设置SO_REUSEPORT为0,就不能绑定同一个端口,通常第二个套接字会提示bind错误。

UDP套接字和TCP套接字可以绑定同一个端口,UDP和TCP端口号没有任何关系。

3.绑定同一端口的多个套接字如何接收数据?

UDP接收数据分析

 a.绑定真实地址(除INADDR_ANY之外的地址)的套接字,最后进行绑定操作的套接字优先收到数据。

b.绑定了INADDR_ANY地址的套接字需等绑定真实地址的套接字处理完才有可能收到数据。

c.都是绑定INADDR_ANY地址的套接字,最后进行绑定操作的套接字优先收到数据。

TCP接收数据分析

a.绑定真实地址(除INADDR_ANY之外的地址)的套接字,最先进行绑定操作的套接字优先收到数据。

b.绑定了INADDR_ANY地址的套接字需等绑定真实地址的套接字处理完才有可能收到数据。

c.都是绑定INADDR_ANY地址的套接字,最先进行绑定操作的套接字优先收到数据。

4.SO_REUSEADDR和SO_REUSEPORT选项设置

int on = 1;
setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

int on = 1;
setsockopt(sock_fd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on));
  • 设置端口复用套接字选项需要在调用bind函数之前
  • SO_REUSEADDR和SO_REUSEPORT套接字选项级别(level)为SOL_SOCKET
  • 选项值:on=0 关闭选项,on:=1 开启选项 

5.SO_REUSEADDR和SO_REUSEPORT在实际中的运用?

5.1 解决TCP套接字处于TIME_WAIT状态占用端口号问题。

TCP套接字处于TIME_WAIT状态,套接字资源还未释放,端口也未释放,需要设置端口复用才能进行重复绑定。

5.2 程序重启后,端口未释放,导致程序重启绑定失败,服务器程序常见。

这种情况在服务器重启时比较常见,所以需要设置端口复用来解决。文章来源地址https://www.toymoban.com/news/detail-725930.html

到了这里,关于socket端口复用之TCP和UDP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【socket】从计算机网络基础到socket编程——Windows && Linux C语言 + Python实现(TCP+UDP)

    简单讲一下基础知识,便于后面代码的理解,建议大概浏览一下这一小节内容。这里讲的只是冰山一角,建议大家学习计算机网络相关知识,推荐几本书: 《计算机网络》(谢希仁) 《计算机网络 自顶向下方法》 《计算机网络技术》 《计算机网络基础及应用》 《Linux C从入

    2024年02月08日
    浏览(60)
  • 【APUE】网络socket编程温度采集智能存储与上报项目技术------多路复用

    作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习 擅长领域:驱动开发,嵌入式软件开发,BSP开发 作者主页:一个平凡而乐于分享的小比特的个人主页 文章收录专栏:网络socket编程之温度采集智能存储与上报项目,本

    2024年04月10日
    浏览(48)
  • 「网络编程」第二讲:socket套接字(四 - 完结)_ Linux任务管理与守护进程 | TCP协议通讯流程

    「前言」文章是关于网络编程的socket套接字方面的,上一篇是网络编程socket套接字(三),这篇续上篇文章的内容,下面开始讲解!  「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 「枫叶先生有点文青病」「句子分享」 Time goes on and on, never to an 

    2024年02月10日
    浏览(65)
  • 网络编程 IO多路复用 [epoll版] (TCP网络聊天室)

    //head.h            头文件 //TcpGrpSer.c     服务器端 //TcpGrpUsr.c     客户端 通过IO多路复用实现服务器在单进程单线程下可以与多个客户端交互  API epoll函数  head.h TcpGrpSer.c TcpGrpUsr.c  

    2024年02月11日
    浏览(57)
  • 网络编程 IO多路复用 [select版] (TCP网络聊天室)

    //head.h                 头文件 //TcpGrpSer.c        服务器端 //TcpGrpUsr.c        客户端 select函数  功能:阻塞函数,让内核去监测集合中的文件描述符是否准备就绪,若准备就绪则解除阻塞。 原型: head.h TcpGrpSer.c TcpGrpUsr.c    

    2024年02月14日
    浏览(53)
  • 网络编程:TCP socket

    TCP(Transmission Control Protocol,传输控制协议)提供的是面向连接,可靠的字节流服务。即客户和服务器交换数据前,必须现在双方之间建立一个TCP连接,之后才能传输数据。并且提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。 TCP不

    2024年02月05日
    浏览(48)
  • 【网络编程】TCP Socket编程

    流套接字: 使用传输层TCP协议 TCP: 即Transmission Control Protocol(传输控制协议),传输层协议。 TCP的特点: 有连接 可靠传输 面向字节流 有接收缓冲区,也有发送缓冲区 大小不限 ServerSocket 是 创建TCP服务端Socket 的API。 注意: ServerSocket 只能用于 服务器端。 构造方法: 方法签名

    2024年02月07日
    浏览(49)
  • 基于TCP的Socket网络编程

    前言: Socket通信是基于TCP/IP协议的通信。在工作和做项目中应用非常广,下面来介绍下Socket网络编程! Socket的介绍 首先,在Socket网络编程中我们要了解两个重要的东西,ip和端口号,一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等。这些服务完全

    2024年02月11日
    浏览(45)
  • Go语言网络编程(socket编程)TCP

    TCP协议 TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议,因为是面向连接的协议,数据像水流一样传输,会存在黏包问题。 TCP服务端 一个TCP服务端可以同时连接很

    2024年02月09日
    浏览(58)
  • Linux TCP/UDP socket 通信和IO多路复用

    主机字节序 16 位值 == 网络字节序 16 位值 主机字节序 32 位值 == 网络字节序 32 位值 主机字节序的字符串IP地址  == 网络字节序的整形IP地址 将监听的套接字和本地IP和端口进行关联 给监听的套接字设置监听,开始检测客户端链接 等待并接受客户端的连接,阻塞函数,没有客

    2024年02月05日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包