linux bind не создает сокет - PullRequest
0 голосов
/ 09 марта 2012

У меня странная проблема.Я пытаюсь создать сокет 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/ телевидение / США / сериал / Калифорния / SeasonOne / xvid-Conversions

Я не получаю "my_socket".Вместо этого я нахожу какой-то случайный сокет с именем вроде "xvid-talk".

/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

Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 09 марта 2012

Ничего действительно странного не происходит. Если вы посмотрите на результат sizeof(addr.sun_path), он должен быть около 100 или около того байтов. Когда вы пытаетесь скопировать в него более чем этот размер с помощью strncpy(), вы усекаете путь к тому, что вписывается в sun_path, а bind () просто создает запись в файловой системе для любого имени, кроме последнего действительного имени каталога.

Нет смысла помещать сокет так глубоко в структуру каталогов. Вы можете так же легко поместить его в / tmp или / run или в какой-нибудь общий каталог, который есть у клиентов и сервера, если вы хотите немного большей безопасности.

Кроме того, вы, вероятно, хотите

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

на всякий случай, если указанный путь не заканчивается косой чертой.

1 голос
/ 09 марта 2012

Да, мой комментарий, кажется, прибивает его. sun_path - 108 символов в заголовке, на который я смотрел, подсчитайте 108 символов в своем аргументе ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...