簡體   English   中英

為什么 UNIX 域數據報套接字的 recvfrom() 返回無效參數?

[英]Why does recvfrom() for a UNIX domain datagram socket return Invalid Argument?

我正在開發一個將 UNIX 域數據報襪子用於 IPC 的程序。 一半時間它工作正常,但另一半它返回“無效參數”。 我已經確認這不應該是由於套接字路徑重用錯誤,套接字上設置了 SO_REUSEADDR,即使刪除了套接字路徑中的任何殘留文件,也會發生錯誤。 為什么會發生這種情況? 這是代碼:

服務器

/* receive data from the client and return a structure containing operation information and argument */
int handle_input(int server_socket, module *module_registry) {
        input client_input;     // operation and argument sent from client
        struct sockaddr *client_address;
        unsigned int cl_address_len;

        if(recvfrom(server_socket, &client_input, sizeof(input), 0, client_address, &cl_address_len) < 0) {
                fprintf(stderr, "failed to receive from datagram socket\n");
                perror("guru meditation");
                return 0;
        }

        /* parse input ... */
}

客戶

int main(int argc, char **argv) {    
    /* parse input ... */

    /* initialize client socket and addressing information */
    if((client_socket = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0) {
        fprintf(stderr, "failed to bind client socket\n");
        exit(1);
    }

    /* initialize server socket addressing information */
    memset(&server_addr, 0, sizeof(struct sockaddr_un));
    server_addr.sun_family = AF_UNIX;
    snprintf(server_addr.sun_path, sizeof server_addr.sun_path, "%s", SOCK_PATH);

    if(sendto(client_socket, &client_input, sizeof(input), 0, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_un))
        fprintf(stderr, "failed to send message to daemon\n");
        exit(1);
    }

    exit(0);
}

一半時間它工作正常,但另一半它返回“無效參數”

那是因為cl_address_len需要使用地址緩沖區的大小進行初始化,但它包含一個不確定的值。

您需要進行以下更改:

struct sockaddr_un client_address;
socklen_t cl_address_len = sizeof client_address;
if(recvfrom(server_socket, &client_input, sizeof(input), 0, (struct sockaddr*)&client_address, &cl_address_len) < 0) {

暫無
暫無

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

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