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; }
额外说明
- 如果你想更严谨地计算
struct sockaddr_un的有效长度,可以用sizeof(addr.sun_family) + strlen(addr.sun_path) + 1,因为sun_path后面的填充字节不需要传递给connect。 - 确保
/path/to/socket是服务端已经创建并监听的Unix域套接字文件,否则修正参数后会报"Connection refused"错误,但这和当前的"Invalid argument"是不同的问题。
内容的提问来源于stack exchange,提问作者Zephyrus
相关产品推荐
相关产品推荐

