簡體   English   中英

c udp 插座無法正確接收/發送

[英]c udp socket not receiving/sending correctly

我目前在測試 UDP sockets 時遇到了一些麻煩。 所以我有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 的 output 是這樣的:

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

rcv_send 的 output 是這樣的:

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調用,因為您沒有在同一端口上打開兩個程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM