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

前言

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

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

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

验证

TCP 绑定 8080

c 复制代码
#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

c 复制代码
#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。

bash 复制代码
$ 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

参考资料

相关推荐
发光小北10 小时前
五口百兆pn优先交换机现场应用能遇到哪些问题?
网络协议
XiaoMaqqqq11 小时前
目前知名的IP驱动产业新场景新工具有哪些
网络·python·网络协议·tcp/ip
尹人入圣15 小时前
市面上靠谱的IP驱动产业新场景新工具哪个好
网络·python·网络协议·tcp/ip
Caroline51615 小时前
GPT Image 2.5还能这么玩!一套提示词生成IP吉祥物,附完整案例
前端·gpt·tcp/ip
2301_8026510815 小时前
网络编程:UDP协议
网络·网络协议·udp
zxanz115 小时前
SSL 证书会影响 GEO 跟 SEO 排名吗?
网络·网络协议·ssl
小此方16 小时前
Linux网络(十八):TCP连接管理详解:从三次握手、四次挥手到CLOSE_WAIT与TIME_WAIT,深入理解2MSL与端口复用
linux·网络·网络协议·tcp/ip
今年下半年21 小时前
记录一次IBMS物联网项目的架构设计及技术栈应用
物联网·websocket·网络协议·tcp/ip·微服务·udp·kafka
XUEYUAN52127 天前
ASN 自治系统号风控:平台如何通过 IP 所属自治域批量识别代理流量
python·网络协议·http·网络安全·socks5
CHENKONG_CK7 天前
破解制鞋打磨痛点:RFID赋能去毛刺工序自动化升级
网络·单片机·嵌入式硬件·网络协议·tcp/ip