当前位置: 首页 > news >正文

TCP 和 UDP 可以绑定相同的端口吗?

前言

当一个网络接口接收到一个数据报时,IP 模块首先检查目的地址是否为自己的 IP 地址,如果是的话,数据报交付给由 IPv4 头部的协议字段指定的协议模块

TCP 和 UDP 在内核中是两个完全独立的模块,送给 TCP/UDP 模块的报文根据「端口号」确定送给哪个应用程序处理,因此 TCP 和 UDP 可以绑定相同的端口。

下面就用代码来演示用 TCP 和 UDP 绑定相同端口。

验证

TCP 绑定 8080

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> int main() {// AF_INET: IPv4// SOCK_STREAM: TCPint sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("socket failed");exit(1);}// 初始化服务器地址和端口struct sockaddr_in serv_addr;memset(&serv_addr, 0, sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");serv_addr.sin_port = htons(8080);// 绑定套接字if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {perror("bind failed");close(sockfd);exit(1);}// 监听连接if (listen(sockfd, 128) < 0) {perror("listen failed");close(sockfd);exit(1);}sleep(1000);close(sockfd);return 0;
}

UDP 绑定 8080

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> int main() {// AF_INET: IPv4// SOCK_DGRAM: UDPint sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) {perror("socket failed");exit(1);}// 初始化服务器地址和端口struct sockaddr_in serv_addr;memset(&serv_addr, 0, sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");serv_addr.sin_port = htons(8080);// 绑定套接字if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {perror("bind failed");close(sockfd);exit(1);}sleep(1000);close(sockfd);return 0;
}

查看绑定情况

可以使用 netstat 命令查看,可以看到两个进程都绑定到了 127.0.0.1:8080。

$ netstat -nlp | grep "8080"
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN      78350/./tcp         
udp        0      0 127.0.0.1:8080          0.0.0.0:*                           78394/./udp

参考资料

  • 《TCP/IP详解 卷1:协议》
  • TCP 和 UDP 可以使用同一个端口吗?
http://www.lryc.cn/news/536225.html

相关文章:

  • 【Python网络爬虫】爬取网站图片实战
  • 2024年博客之星年度评选—创作影响力评审+主题文章创作评审目前排名(2024博客之星陪跑小分队助力2024博客之星创作者成长)
  • 【CLIP系列】4:目标检测(ViLD、GLIP)
  • Qt Designer菜鸟使用教程(实现一个本地英文翻译软件)
  • 【一文读懂】HTTP与Websocket协议
  • 大语言模型入门
  • SQL 大厂面试题目(由浅入深)
  • Shader Step和frac函数
  • FreeRtos实时系统: 十二.FreeRTOS的队列集
  • NLP Word Embeddings
  • 如何在24GB的GPU上运行DeepSeek-R1-Distill-Qwen-32B
  • 2025年二级建造师报名流程图解
  • 深入浅出:Python 中的异步编程与协程
  • 八大排序——简单选择排序
  • vue使用CSS布局技术,实现div定位到页面底部或顶部并居中功能
  • Jenkins 部署 之 Mac 一
  • 【FastAPI 使用FastAPI和uvicorn来同时运行HTTP和HTTPS的Python应用程序】
  • HCIA-路由器相关知识和面试问题
  • Docker+Jenkins自动化部署SpringBoot项目【详解git,jdk,maven,ssh配置等各种配置,附有示例+代码】
  • PCL 点云数学形态学操作(腐蚀)
  • 【设计模式】【行为型模式】观察者模式(Observer)
  • RAGFlow和Dify对比
  • AI前端开发:蓬勃发展的机遇与挑战
  • 结构型模式---代理模式
  • Java面向对象一:相关概念
  • CEF132 编译指南 MacOS 篇 - depot_tools 安装与配置 (四)
  • React VS Vue
  • 伺服报警的含义
  • CSS 属性选择器详解与实战示例
  • 基于STM32、HAL库、HS12864(ST7920,并行接口)C语言程序设计