【发布时间】:2012-07-24 13:09:29
【问题描述】:
如标题所述,我的 connect() 调用具有相应地址的 unix 域类型套接字会导致错误 ENOENT: no such file or directory。
正确初始化了两个套接字,并相应地创建和绑定了套接字文件。服务器和客户端套接字在不同的进程中运行,尽管客户端进程是 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 个字节
- 创建和绑定两个套接字时没有错误
- 服务器套接字处于监听状态
- sizeof(address) 按原样返回 110
现在我想知道为什么手册页示例不起作用,以及是否有未在linux.die.net 或www.kernel.org 更新的更改。如果相关的话,我的操作系统是 Debian Squeeze。
任何想法我做错了什么?以及如何解决?如果您需要更多代码或有疑问,请随时问我(虽然我可能不需要说明这一点,但这是我在这里的第一篇文章>.
顺便说一句,对不起我的英语不好
更新 2
解决了。为了清楚起见,我将在下面的额外答案中发布它。
【问题讨论】:
-
用
strcpy代替memcpy和手动放置空终止符怎么样? -
感谢您的回复。我刚才试了一下,没变。顺便说一句,空终止符已经手动设置。
-
die.net 是一个糟糕的网站,其中包含过时的信息和大量广告。由于大量的 SEO,它得以幸存——仅此而已。我建议你永远不要使用它。
-
谢谢。无论如何,我更喜欢 www.kernel.org。你会推荐其他页面吗?也许我可以在那里找到一些东西......
-
更新后你的短语“除了最后一个”不再成立,是吗?
标签: c++ unix-socket