gpt4 book ai didi

c++ - Unix 域 : connect() : No such file or directory

转载 作者:可可西里 更新时间:2023-11-01 17:58:49 25 4
gpt4 key购买 nike

如标题中所述,我的 connect() 调用具有相应地址的 unix 域类型套接字导致错误 ENOENT:没有这样的文件或目录

两个套接字已正确初始化,并相应地创建和绑定(bind)了套接字文件。服务器和客户端套接字在不同的进程中运行,尽管客户端进程是 fork()-ed 和 execl()-ed。这也是我解析客户端和服务器套接字地址的方式,我用它来设置客户端套接字。服务器进程正在使用 pthreads。

这是我的connect() 尝试:

struct sockaddr_un address;
address.sun_family = AF_UNIX;
memcpy(address.sun_path, filepath.c_str(), filepath.length());
address.sun_path[filepath.length()] = '\0';

if(-1 == connect(this->unix_domain_descriptor_.descriptor(), \
(struct sockaddr*)&address, \
size))
{
global::ExitDebug(-1, "connect() failed", __FILE__, __LINE__);
return -1;
}

我尝试了不同的大小值,例如:

//  this is from unix(7) man page. It doesn't work neither with nor without "+1"
socklen_t size = offsetof(struct sockaddr_un, sun_path);
size += strlen(address.sun_path) + 1;

//  this is from one of my books about linux programming
socklen_t size = sizeof(address);

//  this is from a sample code which I found at the internet
socklen_t size = sizeof(address.sun_family) + strlen(address.sun_path);

//  Update 1: 
socklen_t size = SUN_LEN(&address);

//  this is what I tried out after looking into the declaration
// of struct sockaddr_un
socklen_t size = strlen(address.sun_path);

令人惊讶的是,除了最后一个之外的所有初始化都会导致 connect()EINVAL: invalid argument 错误,我得到 ENOENT: no such file 或目录 仅与最后一个。我什至尝试了互联网上的整个示例,但没有成功。显然,用 size_t 或 int 交换 socklen_t 不会改变任何东西。

我已经检查过了:

  • address.sun_path 包含从根目录开始的正确套接字文件路径
  • address.sun_path 长度为61个字符
  • address.sun_family 设置为 AF_UNIX/AF_LOCAL
  • address.sun_family 的大小为 2 个字节
  • 在创建和绑定(bind)两个套接字时没有错误
  • 服务器套接字处于监听状态
  • sizeof(address) 按预期返回 110

现在我想知道为什么手册页示例不起作用,以及是否有未在 linux.die.net 更新的更改或 www.kernel.org .如果相关的话,我的操作系统是 Debian Squeeze。

知道我做错了什么吗?以及如何解决?如果您需要更多代码或有任何疑问,请随时问我(虽然我可能不需要说明这一点,但这是我在这里的第一篇文章 >.<)。

顺便说一句,抱歉我的英语不好

更新2

已解决。为清楚起见,我会将其发布在下面的额外答案中。

最佳答案

在确定我正在正确处理套接字之后,我稍微更改了 connect() 的代码,现在它可以工作了。我刚刚在我的变量声明之后添加了这一行:

memset(&address, 0, sizeof(struct sockaddr_un));

有谁知道为什么我需要将整个变量设置为 0 才能使其工作?我应该在新主题中问这个问题还是可以在这里问这个问题?

关于c++ - Unix 域 : connect() : No such file or directory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11631578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com