我有一个奇怪的问题。我试图在目录中创建一个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
我做错了什么?
答案 0 :(得分:3)
没有什么比这更奇怪了。如果查看sizeof(addr.sun_path)
的结果,它应该是大约100个字节。当您尝试使用strncpy()
将超过该大小的文件复制到其中时,您将截断适合sun_path的路径,而bind()只是为最后一个有效目录名称之外的任何名称创建文件系统条目。
将插槽深入到目录结构中没有任何好处。如果你想要更高的安全性,你可以很容易地将它放在/ tmp或/ run或一些只有客户端和服务器有权限的公共目录中。
另外,你可能想要
socketname += "/my_socket"; // prefix with slash
以防名为pass的路径不以斜杠结尾。
答案 1 :(得分:1)