c++ - linux bind 不创建套接字

标签 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 <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;
}

问题是当我运行这样的程序时

./a.out/home/rasterblaster/local/media/video/television/UnitedStates/series/Californication/SeasonOne/xvid-conversions

我没有得到“my_socket”。相反,我找到了一些名为“xvid-convers”的随机套接字。

/home/rasterblaster/local/media/video/television/UnitedStates/series/Californication/SeasonOne$ ls -la

drwxrwxrwx 3 rasterblaster rasterblaster  4096 2012-03-08 22:06 .
drwxrwxrwx 3 rasterblaster rasterblaster  4096 2012-03-08 21:39 ..
srwxrwxr-x 1 rasterblaster rasterblaster  0 2012-03-08 22:06:08 xvid-convers
drwxrwxrwx 2 rasterblaster rasterblaster  4096 2012-03-08 21:39 xvid-conversions

我做错了什么?

最佳答案

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

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

另外,你可能想要

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

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

关于c++ - linux bind 不创建套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9628902/

相关文章:

c++ - C++ STL 数组的迭代器大小

比较 If 语句中的字符

c - 如何设置 if 语句

c - Linux Kernel vfs_write 函数混淆

c - 在 linux 中使用 C 和 uinput 库模拟击键

c++ - QT_AUTO_SCREEN_SCALE_FACTOR 没有效果

c++ - 在 C++ 项目中使用 (OSX) Core MIDI

c++ - 创建将 .o 存储到目录的 makefile c++

c - 是否可以在 linux 上为许多体系结构编译 c?

linux - 如何更改 Amazon EC2 实例的平台