与SOCK_DGRAM一起使用AF_UNIX会产生unix套接字名称长度的问题

时间:2010-12-14 10:04:57

标签: c++ linux 64-bit ipc

我的问题是关于使用AF_UNIX和SOCK_DGRAM的IPC。 从代码中删除一些错误检查后,我的服务器代码是:

 sd = socket(AF_UNIX, SOCK_DGRAM, 0);
 memset(&serveraddr, 0, sizeof(serveraddr));
 serveraddr.sun_family = AF_UNIX;
 strcpy(serveraddr.sun_path, SERVER_PATH);
 length = BUFFER_LENGTH;
 rc = setsockopt(sd, SOL_SOCKET, SO_RCVLOWAT, (char *)&length, sizeof(length));
 rc = bind(sd, (struct sockaddr *)&serveraddr, SUN_LEN(&serveraddr));
 rc = recv(sd, buffer, sizeof(buffer), 0));
从代码中删除一些错误检查后,

我的客户端代码是:

 sd = socket(AF_UNIX, SOCK_DGRAM, 0);
 memset(&serveraddr, 0, sizeof(serveraddr));
 serveraddr.sun_family = AF_UNIX;
 strcpy(serveraddr.sun_path, SERVER_PATH);
 memset(buffer, 'a', sizeof(buffer));
 socklen_t server_length = sizeof(struct sockaddr);
 sendto(sd, buffer, sizeof(buffer), 0, (struct sockaddr *)&serveraddr, server_length);

我可以看到的问题在于SERVER_PATH的定义。 一旦我的SERVER_PATH的长度超过14个字符,客户端发送(...)将失败并显示错误(“没有这样的文件或目录”)。

有些注意事项:

任何想法?

1 个答案:

答案 0 :(得分:2)

我怀疑问题与sizeof(struct sockaddr)有关。在我的系统上,允许14个字符的地址字段。试试sizeof(struct sockaddr_un)