gpt4 book ai didi

c - 服务器和客户端对一个公共(public)端口号显示的不同端口号

转载 作者:行者123 更新时间:2023-12-01 12:46:05 25 4
gpt4 key购买 nike

我有一个用 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);

客户端.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)?

最佳答案

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

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

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

另请注意,您正在以网络字节序格式打印端口号,要以主机字节序打印它,请像这样使用 ntohs() (在客户端上类似)

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

这将使服务器打印出 9374

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

关于c - 服务器和客户端对一个公共(public)端口号显示的不同端口号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15819746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com