c - 为什么 UNIX 域数据报套接字的 recvfrom() 返回无效参数?

标签 c sockets unix udp unix-socket

我正在开发一个使用 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);
}

最佳答案

Half the time it works fine, but the other half it returns "Invalid argument"

这是因为 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) {

关于c - 为什么 UNIX 域数据报套接字的 recvfrom() 返回无效参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59778239/

相关文章:

只能打印字符,不能打印字符串

android - 可以在服务器端使用节点js与scoket.io(1.0.4)一起使用的Android库

sockets - sbatch:错误:批处理作业提交失败:运行Snakemake时发送/接收操作时套接字超时

c - Longjmp 超出信号处理程序?

c - 如何在 C 中调试不干净的套接字关闭?

linux - PS1没有设置颜色

c - OpenSSL导致丢包?奇怪的CPU使用率

c++ - 为什么编译器在 C/C++ 中填充结构?

c - 如果我们只有一个 MQ,则同步 IBM MQ : need or not,

python - 使用 python 创建用于发送 TCP 和 UDP 数据包的客户端和服务器程序