You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++连接AF_UNIX套接字时提示Invalid argument错误排查

问题分析与解决:Unix套接字connect报"Invalid argument"错误

核心错误出在connect函数的参数传递上:你把条件判断表达式sizeof(addr) == -1当成了第三个参数(地址长度)传入,这完全不符合函数要求,直接触发了"Invalid argument"错误。

正确的写法应该是将connect的返回值与-1比较,而不是把判断逻辑写到参数里。同时,connect的第三个参数需要传入套接字地址结构的实际长度。

修正后的代码

#include <iostream>
#include <sys/socket.h>
#include <sys/un.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

using namespace std;

int main() {
    int fd = socket(AF_UNIX, SOCK_SEQPACKET, 0);
    if (fd == -1)
    {
        cout << strerror(errno) << "\n";
        return 1;
    }

    struct sockaddr_un addr;
    memset(&addr, 0, sizeof(addr));
    addr.sun_family = AF_UNIX;
    strcpy(addr.sun_path, "/path/to/socket");
    // 修正connect的参数:第三个参数是地址长度,判断返回值是否为-1
    if (connect(fd, (const struct sockaddr *)&addr, sizeof(addr)) == -1)
    {
        close(fd);
        cout << strerror(errno) << "\n";
        return 1;
    }

    close(fd);
    return 0;
}

额外说明

  1. 如果你想更严谨地计算struct sockaddr_un的有效长度,可以用sizeof(addr.sun_family) + strlen(addr.sun_path) + 1,因为sun_path后面的填充字节不需要传递给connect。
  2. 确保/path/to/socket是服务端已经创建并监听的Unix域套接字文件,否则修正参数后会报"Connection refused"错误,但这和当前的"Invalid argument"是不同的问题。

内容的提问来源于stack exchange,提问作者Zephyrus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:33:31