简体   繁体   English

Linux绑定不创建套接字

[英]linux bind don't create socket

I am having a weird problem. 我有一个奇怪的问题。 I am trying to create a unix socket in a directory but it does not create the one I want. 我正在尝试在目录中创建一个UNIX套接字,但它没有创建我想要的套接字。 I have cut down the code to the below example. 我将代码缩减为以下示例。

#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;
}

The problem is that when I run program like 问题是当我运行程序时

./a.out /home/rasterblaster/local/media/video/television/UnitedStates/series/Californication/SeasonOne/xvid-conversions ./a.out / home / rasterblaster / local / media / video / television /美国/系列/加利福尼亚州/ SeasonOne / xvid-conversions

I do not get "my_socket". 我没有得到“ my_socket”。 Instead I find some random socket named like "xvid-convers". 取而代之的是,我找到了一些名为“ 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

What am I doing wrong? 我究竟做错了什么?

There is nothing really weird going on. 真的没有什么奇怪的事情。 If you look at the result of sizeof(addr.sun_path) it should be about 100 or so bytes. 如果查看sizeof(addr.sun_path)的结果,则大约应为100个字节。 When you try to copy more than that size into it with strncpy() you are truncating the path to what fits into sun_path and bind() is just creating a filesystem entry for any name beyond the last valid directory name. 当您尝试使用strncpy()将大于该大小的文件复制到其中时,您正在截断适合sun_path的路径,bind()只是为最后一个有效目录名称之外的任何名称创建文件系统条目。

There is no benefit to placing a socket this deep into a directory structure. 将套接字插入目录结构没有任何好处。 You can just as easily put it in /tmp or /run or some common directory that just clients and the server have permission if you want a bit more security. 您也可以轻松地将其放在/ tmp或/ run或一些通用目录中,如果您想要更高的安全性,这些目录只有客户端和服务器才具有权限。

Also, you probably want 另外,您可能想要

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

just in case the path named passed doesn't end in a slash. 以防万一名为passed的路径不以斜杠结尾。

Yep, my comment seems to nail it. 是的,我的评论似乎是钉牢。 sun_path is 108 chars in the header I looked at, count 108 chars in your argument... sun_path在我查看的标头中为108个字符,在您的参数中为108个字符...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM