在c++中连接到AF_UNIX套接字时参数无效

dgtucam1  于 2023-03-14  发布在  Unix
关注(0)|答案(1)|浏览(166)

下面的代码会编译,但在执行时报告Invalid argument

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

struct sockaddr_un addr;
memset (&addr, 0, sizeof (addr));
addr.sun_family = AF_UNIX;
strcpy (addr.sun_path, "/path/to/socket");
if (connect (fd, (const struct sockaddr *) &addr, sizeof (addr) == -1))
{
    close (fd);
    cout << strerror (errno) << "\n";
    return;
}

close (fd);

当它试图调用connect时发生错误。它没有给予关于哪个参数无效或为什么无效的任何指示。
在创建套接字时,我也尝试过使用SOCK_STREAM,但它导致了同样的错误。
你知道是什么问题吗?

3xiyfsfu

3xiyfsfu1#

connect()调用中的右括号位置错误:

if (connect (fd, (const struct sockaddr *) &addr, sizeof (addr) == -1))
                                                                     ^
                                                                   wrong

这会导致您将不正确的值传递给connect()addrlen参数(即,表达式sizeof(addr) == -1的求值结果,而不仅仅是sizeof(addr)的值),从而产生错误。
这也会导致您错误地比较connect()的返回值(即,将其计算为true/false,而不是-1)。
您需要将右括号移动到正确的位置:

if (connect (fd, (const struct sockaddr *) &addr, sizeof (addr)) == -1)
                                                               ^
                                                            correct

否则,将表达式分解为单独的语句,例如:

int res = connect (fd, (const struct sockaddr *) &addr, sizeof (addr));
if (res == -1)

相关问题