0

我的操作系统是 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);
}

我的目标是在侦听(服务器)端获得正确的端口号。谢谢你的帮助 !

4

1 回答 1

2

服务器正在打印的端口号是客户端的端口号。这与服务器的端口号不同。然后,服务器可以使用此端口号将响应发送回客户端。

此外,在发送 UDP 数据报时,如果您不绑定到特定端口,系统将随机选择一个。

于 2020-09-16T18:52:00.937 回答