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

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: TCP
    int 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: UDP
    int 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.kler.cn/a/544416.html

相关文章:

  • Android多包路由方案: ARouter 路由库
  • 基于进化式大语言模型的下一代漏洞挖掘范式:智能对抗与自适应攻防体系
  • springboot239-springboot在线医疗问答平台(源码+论文+PPT+部署讲解等)
  • Unity URP后处理在Game窗口不显示
  • SDKMAN! 的英文全称是 Software Development Kit Manager(软件开发工具包管理器)
  • 语义分割文献阅读——SETR:使用Transformer从序列到序列的角度重新思考语义分割
  • 批量修改mysql字符串字段子字符串
  • Win10环境借助DockerDesktop部署Open web UI集成DeepSeek
  • 9、Python面试题解析:函数的用法和高级
  • STM32 HAL库 CANbus通讯(C语言)
  • 基于SpringBoot+Vue的求职招聘管理系统
  • 自然语言处理NLP入门 -- 第一节基础概念
  • 【嵌入式Linux应用开发基础】open函数与close函数
  • oracle dbms_sqltune 使用
  • Visual Studio Code 的 AI 编程助手
  • 概率论、组合数学知识点汇总
  • 加油口,电梯门的对称性对 TCP/IP 传输协议的启示
  • 通义灵码 2.0 全新升级,阿里云正式推出繁星计划
  • 云原生小记:负载均衡
  • 字节跳动后端一面
  • es凌晨自己把索引删除了,包括es自己的索引
  • 【STM32】输入捕获实现超声波测距
  • 大模型基本原理(四)——如何武装ChatGPT
  • 四、自然语言处理_08Transformer翻译任务案例
  • 【已解决】lxml.etree.ParserError: Document is empty
  • ChatGPT macOS 桌面应用让你的编程体验更上一层楼