c udp 套接字不 receiving/sending 正确

c udp socket not receiving/sending correctly

我目前在测试 UDP 套接字时遇到了一些问题。 所以我有2个c程序,一个发送和接收,另一个接收和发送消息。

这里是send_recv.c:

#define PORT    1010

int main(int argc, const char *argv[]) {
        int socketInfo, opt;
        struct sockaddr_in server;
        char msgOut[30], msgIn[30];

        opt = 1;

        printf("Input message: ");
        fgets(msgOut, 30, stdin);

        socketInfo = socket(AF_INET, SOCK_DGRAM, 0);
        if(socketInfo < 0) {
                perror("socket error");
                return EXIT_FAILURE;
        }

        if(setsockopt(socketInfo, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
                perror("setsockopt failed");
                return EXIT_FAILURE;
        }

        server.sin_family = AF_INET;
        server.sin_addr.s_addr = INADDR_ANY;
        server.sin_port = htons(PORT);

        if(bind(socketInfo, (struct sockaddr *)&server, sizeof(server)) < 0) {
                perror("bind error");
                return EXIT_FAILURE;
        }

        if(connect(socketInfo, (struct sockaddr *)&server, sizeof(server)) < 0) {
                perror("connection error");
                return EXIT_FAILURE;
        }

        puts("connected");

        send(socketInfo, msgOut, strlen(msgOut), 0);

        puts("sleeping for 5");
        sleep(5);

        puts("message sent");

        recv(socketInfo, msgIn, sizeof(msgIn), 0);

        printf("received msg: %s\n", msgIn);

        close(socketInfo);

        return EXIT_SUCCESS;
}

这里是 recv_send.c:

#define PORT    1010

int main(int argc, const char *argv[]) {
        int socketInfo, opt;
        struct sockaddr_in server;
        char msgOut[30], msgIn[30];

        opt = 1;

        socketInfo = socket(AF_INET, SOCK_DGRAM, 0);
        if(socketInfo < 0) {
                perror("socket error");
                return EXIT_FAILURE;
        }

        if(setsockopt(socketInfo, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
                perror("setsockopt failed");
                return EXIT_FAILURE;
        }

        server.sin_family = AF_INET;
        server.sin_port = htons(PORT);
        server.sin_addr.s_addr = INADDR_ANY;

        if(bind(socketInfo, (struct sockaddr *)&server, sizeof(server)) < 0) {
                perror("bind error");
                return EXIT_FAILURE;
        }

        if(connect(socketInfo, (struct sockaddr *)&server, sizeof(server)) < 0) {
                perror("connection error");
                return EXIT_FAILURE;
        }

        puts("connected");

        recv(socketInfo, msgIn, sizeof(msgIn), 0);

        printf("received msg: %s\n", msgIn);

        printf("Input message: ");
        fgets(msgOut, 30, stdin);

        send(socketInfo, msgOut, strlen(msgOut), 0);

        puts("message sent");

        close(socketInfo);

        return EXIT_SUCCESS;
}

问题是接收程序从不接收任何东西,发送程序发送然后只接收它已经收到的消息。

send_rcv 的输出是这样的:

Input message: hello there
connected
message sent
received msg: hello there

rcv_send 的输出是这样的:

connected
(ctrl+z) Job 6, 'sudo ./rcv_send' has stopped

另一个问题是,当我不使用 sudo 运行 程序时,它只是这样说:bind error: Permission denied

问题是两个端点都在同一端口上侦听,而 运行 在同一台机器上,并且双方都发送到 INADDR_ANY

此外,1024 以下的端口号是特权端口,因此需要 root 访问权限才能绑定。

为连接的每一端使用不同的端口(1024 或更高),并选择一个特定的 IP 地址进行连接。例如:

#define LOCAL_PORT    1100
#define REMOTE_PORT   1101

...

struct sockaddr_in local, remote;

local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;
local.sin_port = htons(LOCAL_PORT);
remote.sin_family = AF_INET;
remote.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
remote.sin_port = htons(LOCAL_PORT);

if(bind(socketInfo, (struct sockaddr *)&local, sizeof(local)) < 0) {
        perror("bind error");
        return EXIT_FAILURE;
}

if(connect(socketInfo, (struct sockaddr *)&remote, sizeof(remote)) < 0) {
        perror("connection error");
        return EXIT_FAILURE;
}

LOCAL_PORTREMOTE_PORT 的值将在两个程序中交换。

另请注意,您可以取消 setsockopt 调用,因为您没有在同一端口上打开两个程序。