2012-03-09 50 views
0

我有一个奇怪的问题。我试图在目录中创建一个unix套接字,但它不会创建我想要的套接字。我已经减少了代码到下面的例子。linux绑定不创建套接字

#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 /家庭/ rasterblaster /本地/媒体/视频/电视/ UnitedStates的买家/系列/加州靡情/ SeasonOne/XVID-转换

程序

我没有得到“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 

我在做什么错?

+1

我的第一步是检查路径名称是否不太长... – John3136 2012-03-09 04:29:21

回答

3

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

将套接字深深地放置到目录结构中没有任何好处。您可以轻松地将其放在/ tmp或/ run中,或者如果您想要更多安全性,只需客户端和服务器拥有许可权即可。

此外,你可能想

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

以防命名的路径传递斜线并没有结束。

+0

+1,以及链接到[documentation](http://www.gnu.org/software/libc/manual/html_node/Local-Namespace-Details.html#Local-Namespace-Details)(至少对于glibc)。 – vanza 2012-03-09 04:33:50

+0

是的,就是这样。我现在感到很蠢。我迷路在树上,吓坏了。 – 2012-03-09 04:46:10

1

是的,我的评论似乎钉它。 sun_path是我看到的标题中的108个字符,在您的论点中计数108个字符...