https://www.nowcoder.com/discuss/673572837268955136

一、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 1024

int 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:%s\\\\n\\\\a",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:%s\\\\n\\\\a",strerror(errno));
		exit(1);
	}

	/*监听sockfd描述符*/
	if(listen(sockfd, WAITBUF)==-1)
	{
		fprintf(stderr,"Listen error:%s\\\\n\\\\a",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:%s\\\\n",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:%s\\\\n",strerror(errno));
		exit(1);
	}
	sleep(1000);
	close(sockfd);
}

编译

gcc tcp.c -o tcp
gcc udp.c -o udp

2\. 执行结果

1).2个进程分别建立TCP server

https://img-blog.csdnimg.cn/20201106181232254.png#pic_center