服务器和客户端显示的公共端口号的不同端口号

时间:2013-04-04 19:11:26

标签: c sockets

我有用C编写的服务器和客户端程序,它工作正常,但我无法找出下面解释的行为的原因:

server.c

server_address.sin_family = AF_INET;
server_address.sin_port = htons(9374);
server_address.sin_addr.s_addr = htonl(INADDR_ANY);  
server_len = sizeof(server_address);    
bind(server_sockfd, (struct sockaddr *)&server_address, server_len);

getsockname (server_sockfd, (struct sockaddr *)&server_address, &server_len);
printf("server port = %d\n", server_address.sin_port); 
printf("Server Waiting......\n");
listen(server_sockfd, 5);

client.c

address.sin_family = AF_INET;
address.sin_port = htons(9374);

int length, result;
length = sizeof(address);

result = connect(sockfd, (struct sockaddr *)&address, length);

getsockname(sockfd, (struct sockaddr *)&address, &length);
printf("Connecting to Port = %d \n", address.sin_port);

服务器端的输出:

[root@dhcppc1 Socket]# ./server
server port = 40484 
Server Waiting......

客户端输出:

[root@dhcppc1 Socket]# ./client
Connecting to Port = 18576 

我的问题是:

尽管端口号(9374)和操作在服务器和客户端代码中实现相同,但为什么它们显示不同的端口号(如服务器上的40484和客户端上的18576)?

1 个答案:

答案 0 :(得分:3)

getsockname()返回连接的本地端口号。 TCP连接有两个端口,每个端口对应一个端口。

由于您的客户端未调用bind()来选择本地端口,因此系统随机为您选择了一个端口。

因此,您的服务器程序正在显示它正在侦听的端口,并且您的客户端显示它自己发送的端口。

另请注意,您要以网络端格式打印出端口号,要在主机端进行打印,请使用ntohs()(如客户端类似)

printf("server port = %d\n", ntohs(server_address.sin_port));

这将使服务器打印出9374

如果要获取客户端上的服务器端口,请使用getpeername()而不是getsockname() - 然后再次,您已经知道服务器端口是您连接的端口,9374。