![一个端口号可以同时被两个进程绑定吗?](http://img.jiangsulong.com/220425/054HM610-0.jpg)
文章插图
tcp/udp
一、1个端口号可以同时被两个进程绑定吗?根据端口号的绑定我们分以下几种情况来讨论:
- 2个进程分别建立TCP server,使用同一个端口号8888
- 2个进程分别建立UDP server,使用同一个端口号8888
- 2个进程1个建立TCP server、1个建立UDP server,都使用端口号8888
tcp.c
该程序仅仅创建tcp套接字并绑定端口号8888,没有accept建立连接操作,并且sleep(1000),让进程不要太快退出 。
/*******服务器程序 TCPServer.c ************/#include <stdlib.h>#include <stdio.h>#include <errno.h>#include <string.h>#include <netdb.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#include <pthread.h>#define WAITBUF 10#define RECVBUFSIZE 1024int main(int argc, char *argv[]){ int sockfd,new_fd,nbytes; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int portnumber = 8888; socklen_t sin_size; char hello[512]; char buffer[RECVBUFSIZE]; /*端口号不对,退出*/ /*服务器端开始建立socket描述符*/ if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { fprintf(stderr,"Socket error:%sna",strerror(errno)); exit(1); } /*服务器端填充 sockaddr结构*/ bzero(&server_addr,sizeof(struct sockaddr_in)); server_addr.sin_family=AF_INET; /*自动填充主机IP*/ server_addr.sin_addr.s_addr=htonl(INADDR_ANY); server_addr.sin_port=htons(portnumber); /*捆绑sockfd描述符 进程+端口号+ip+socket*/ if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) { fprintf(stderr,"Bind error:%sna",strerror(errno)); exit(1); } /*监听sockfd描述符*/ if(listen(sockfd, WAITBUF)==-1) { fprintf(stderr,"Listen error:%sna",strerror(errno)); exit(1); } sleep(1000);//让程序不要这么快的退出 close(sockfd); exit(0);}
udp.c该程序仅仅创建udp套接字并绑定端口号8888,没有accept建立连接操作,并且sleep(1000),让进程不要太快退出.
#include <stdlib.h>#include <stdio.h>#include <errno.h>#include <string.h>#include <unistd.h>#include <netdb.h>#include <sys/socket.h>#include <netinet/in.h>#include <sys/types.h>#include <arpa/inet.h>#define SERVER_PORT 8888 #define MAX_MSG_SIZE 1024 int main(void) { int sockfd; struct sockaddr_in addr; /* 服务器端开始建立socket描述符 */ sockfd=socket(AF_INET,SOCK_DGRAM,0); if(sockfd<0) { fprintf(stderr,"Socket Error:%sn",strerror(errno)); exit(1); } /* 服务器端填充 sockaddr结构 */ bzero(&addr,sizeof(struct sockaddr_in)); addr.sin_family=AF_INET; addr.sin_addr.s_addr=htonl(INADDR_ANY); addr.sin_port=htons(SERVER_PORT); /* 捆绑sockfd描述符 */ if(bind(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in))<0) { fprintf(stderr,"Bind Error:%sn",strerror(errno)); exit(1); } sleep(1000); close(sockfd); }
编译gcc tcp.c -o tcpgcc udp.c -o udp
2. 执行结果1).2个进程分别建立TCP server![一个端口号可以同时被两个进程绑定吗?](http://img.jiangsulong.com/220425/054HIL5-1.jpg)
文章插图
情况1执行结果
从结果可知,第二个进程绑定端口号8888绑定失败 。
2).2个进程分别建立UDP server
![一个端口号可以同时被两个进程绑定吗?](http://img.jiangsulong.com/220425/054HL928-2.jpg)
文章插图
情况2执行结果
从结果可知,第二个进程绑定端口号8888绑定失败 。
3).1个建立TCP server、1个建立UDP server
![一个端口号可以同时被两个进程绑定吗?](http://img.jiangsulong.com/220425/054HLV0-3.jpg)
文章插图
【一个端口号可以同时被两个进程绑定吗?】
情况3执行结果
用netstat命令查看信息 。
![一个端口号可以同时被两个进程绑定吗?](http://img.jiangsulong.com/220425/054HIJ0-4.jpg)
推荐阅读
- 一个Java文件的执行全部过程你确定都清楚吗?
- 超实用的tomcat启动脚本实现
- 一张纸的童话故事?关于纸的童话故事
- 一文详解 C++ 框架:日志框架
- 朋友结婚随礼多少钱合适?
- JavaScript前端各种文件下载功能的实现
- WebSocket能干些啥?
- web前端HTML高频面试题
- 乾隆的墓里为什么空一个棺材?乾隆的坟墓什么时候被盗
- 新手在家做自媒体影视剪辑,一个月赚了10158,方法教给大家