一个端口号可以同时被两个进程绑定吗?


一个端口号可以同时被两个进程绑定吗?

文章插图
tcp/udp
一、1个端口号可以同时被两个进程绑定吗?根据端口号的绑定我们分以下几种情况来讨论:
  1. 2个进程分别建立TCP server,使用同一个端口号8888
  2. 2个进程分别建立UDP server,使用同一个端口号8888
  3. 2个进程1个建立TCP server、1个建立UDP server,都使用端口号8888
1. 测试代码我们首先编写两个简单的测试程序 。
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 udp2. 执行结果1).2个进程分别建立TCP server
一个端口号可以同时被两个进程绑定吗?

文章插图
 
情况1执行结果
从结果可知,第二个进程绑定端口号8888绑定失败 。
2).2个进程分别建立UDP server
一个端口号可以同时被两个进程绑定吗?

文章插图
 
情况2执行结果
从结果可知,第二个进程绑定端口号8888绑定失败 。
3).1个建立TCP server、1个建立UDP server
一个端口号可以同时被两个进程绑定吗?

文章插图
【一个端口号可以同时被两个进程绑定吗?】 
情况3执行结果
用netstat命令查看信息 。
一个端口号可以同时被两个进程绑定吗?


推荐阅读