上海网安网站建设,asp.net网站安装教程,魅力网络营销公司,网站设计需要什么前言
当一个网络接口接收到一个数据报时#xff0c;IP 模块首先检查目的地址是否为自己的 IP 地址#xff0c;如果是的话#xff0c;数据报交付给由 IPv4 头部的协议字段指定的协议模块。
TCP 和 UDP 在内核中是两个完全独立的模块#xff0c;送给 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 可以使用同一个端口吗