C++ linux绑定don';不创建套接字

C++ linux绑定don';不创建套接字,c++,c,linux,unix,C++,C,Linux,Unix,我有一个奇怪的问题。我试图在目录中创建一个unix套接字,但它没有创建我想要的。我已将代码缩减为以下示例 #include <iostream> #include <string> #include <cstdlib> #include <string.h> #include <sys/un.h> #include <sys/socket.h> #include <errno.h> #include <li

我有一个奇怪的问题。我试图在目录中创建一个unix套接字,但它没有创建我想要的。我已将代码缩减为以下示例

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

int main(int argc, char *argv[])
{
   std::string socketname(argv[1]);

   socketname += "my_socket";

    int  fd;
    int  result;
    struct  sockaddr_un addr;

    fd = socket(AF_UNIX, SOCK_STREAM, 0);

    if (fd == -1)
    {
        std::cerr << "socket returned " << errno << ": " << strerror(errno) << std::endl;
        exit(1);
    }

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

    addr.sun_family = AF_UNIX;

    strncpy(addr.sun_path, socketname.c_str(), sizeof(addr.sun_path) - 1);

    result = bind(fd, (struct sockaddr *) &addr, sizeof(struct sockaddr_un));

    if (result == -1)
    {
        std::cerr << "bind returned " << errno << ": " << strerror(errno ) << std::endl;
        exit(1);
    }

    return 0;
}

我做错了什么?

没有什么奇怪的事情发生。如果您查看sizeof(addr.sun\u path)的结果,它应该是大约100个字节。当您尝试使用
strncpy()
将超过该大小的文件复制到其中时,您正在截断适合sun_path的路径,而bind()只是为最后一个有效目录名之外的任何名称创建一个文件系统条目

在目录结构中放置如此深的套接字没有任何好处。如果您想提高安全性,您可以同样轻松地将它放在/tmp或/run或某个只有客户端和服务器才有权限的公共目录中

而且,你可能想要

socketname += "/my_socket";  // prefix with slash

以防名为passed的路径不是以斜杠结尾。

没有什么奇怪的事情发生。如果您查看sizeof(addr.sun\u path)的结果,它应该是大约100个字节。当您尝试使用
strncpy()
将超过该大小的文件复制到其中时,您正在截断适合sun_path的路径,而bind()只是为最后一个有效目录名之外的任何名称创建一个文件系统条目

在目录结构中放置如此深的套接字没有任何好处。如果您想提高安全性,您可以同样轻松地将它放在/tmp或/run或某个只有客户端和服务器才有权限的公共目录中

而且,你可能想要

socketname += "/my_socket";  // prefix with slash

以防名为passed的路径不以斜杠结尾。

是的,我的评论似乎很准确。太阳路径在我看的标题中是108个字符,在你的论点中是108个字符…

是的,我的评论似乎很准确。sun_path在我查看的标题中是108个字符,在您的参数中计算108个字符…

我的第一步是检查路径名是否太长…我的第一步是检查路径名是否太长…+1,以及到的链接(至少对于glibc)。是的,就是这样。我现在觉得自己很愚蠢。我在树上迷路了,吓了一跳。+1,还有一个链接(至少对glibc来说是这样)。是的,就是这样。我现在觉得自己很愚蠢。我在树上迷路了,吓了一跳。