我的操作系统是 Ubuntu 20.x 。我有两个程序: server.c
侦听INADDR_ANY
端口2052
并在同一端口client.c
本地发送 UDP 数据包。INADDR_LOOPBACK
程序运行良好,接收到的数据和 IP 地址与发送的匹配;但是端口号不匹配。我可以看到netstat
正在server.c
侦听正确的端口(2052
)并将端口号转换为本地字节序,所以我不知道我做错了什么。
server.c
:
#define MY_PORT 2052
int main (void)
{
int socket_descriptor = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in server_socket = {.sin_addr = {.s_addr = htonl(INADDR_ANY)}, .sin_port = htons(MY_PORT), .sin_family = AF_INET, .sin_zero = {0}};
bind(socket_descriptor, (struct sockaddr *) &server_socket, sizeof(server_socket));
char client_msg[SIZE + 1] = {0};
struct sockaddr_in client_socket;
socklen_t addrlen = sizeof(client_socket);
ssize_t received_bytes = recvfrom(socket_descriptor, client_msg, SIZE, 0, (struct sockaddr*) &client_socket, &addrlen);
// this prints the data sent as expected :
printf("received %ld bytes of data : data was %s\n", received_bytes, client_msg);
// this prints 127.0.0.1 as expected :
printf("the client IP address was %s\n", inet_ntop(AF_INET, &client_socket.sin_addr, (char [INET_ADDRSTRLEN]) {0}, INET_ADDRSTRLEN));
// this prints the WRONG port :
printf("the port was %d\n", ntohs(client_socket.sin_port));
close(socket_descriptor);
}
client.c
:
#define MY_PORT 2052
int main (void)
{
int socket_descriptor = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in client_socket = {.sin_port = htons(MY_PORT), .sin_family = AF_INET, .sin_addr = {.s_addr = htonl(INADDR_LOOPBACK)}, .sin_zero = {0}};
char buffer[SIZE] = "this is a test message";
sendto(socket_descriptor, buffer, SIZE, 0, (struct sockaddr*)&client_socket, sizeof(client_socket));
close(socket_descriptor);
}
我的目标是在侦听(服务器)端获得正确的端口号。谢谢你的帮助 !