- 论坛徽章:
- 0
|
抱歉说的不清楚。
第一种情况,首先邦定指定端口给一个tcp客户套接口,然后邦定相同端口给一个tcp监听套接口:
进程执行下面代码,进程邦定34563建立套接字去连接邦定了20的监听套接口。连接成功后建立一个同样邦定了34563的监听
套接口,并且在另外一个进程中建立套接字连接这个监听套接字,并且成功成功。
在这种情况下,重复邦定34563成功了。
sockfd = socket(AF_INET, SOCK_STREAM, 0);
ret=1;
ret=setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&ret,sizeof(int));
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_port = htons(34563);
len = sizeof(address);
ret=bind(sockfd,(struct sockaddr *)&address,len);
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_port = htons(20);
len = sizeof(address);
result = connect(sockfd, (struct sockaddr *)&address, len);
///////////////////////////////////////////
sockfd1 = socket(AF_INET, SOCK_STREAM, 0);
ret=1;
ret=setsockopt(sockfd1,SOL_SOCKET,SO_REUSEADDR,&ret,sizeof(int));
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_port = htons(34563);
len = sizeof(address);
ret=bind(sockfd1,(struct sockaddr *)&address,len);
ret=listen(sockfd1, 5);
ret=accept(sockfd1,NULL,NULL);
exit(0);
第二种情况,首先邦定指定端口给一个tcp监听套接口,然后邦定相同端口给一个tcp客户套接口:
进程执行下面代码,进程邦定20000建立监听套接字,在另外一个进程中建立套接字连接这个监听套接字,并且连接成功。然后建立一个同样邦定了20000的tcp客户套接口,去连接其他监听套接字,但在邦定时候出错了。
在这种情况下,第二次邦定20000失败了。
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
ret=1;
ret=setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEPORT,&ret,sizeof(int));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = inet_addr("127.0.0.1");
server_address.sin_port = htons(20000);
server_len = sizeof(server_address);
ret=bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
ret=listen(server_sockfd, 5);
ret=accept(server_sockfd,NULL,NULL);
////////////////////////
int sockfd;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
ret=1;
ret=setsockopt(sockfd,SOL_SOCKET,SO_REUSEPORT,&ret,sizeof(int));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = inet_addr("127.0.0.1");
server_address.sin_port = htons(20000);
server_len = sizeof(server_address);
ret=bind(sockfd, (struct sockaddr *)&server_address, server_len);
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_port = htons(34561);
len = sizeof(address);
result = connect(sockfd, (struct sockaddr *)&address, len);
exit(0);
比较这两种情况,似乎可以得到下面的结论:如果一个指定的端口号如果首先邦定到一个监听套接口,那么就不能重复邦定到另外的套接字上(不论这个套接字将会是监听套接字或者客户套接字,在bind调用的时候就会错误返回)。但是如果将一个指定的端口号如果首先邦定到一个客户套接口,那么还可以将这个端口号邦定到另外的套接口上。 |
|