的手册connect
说:
如果套接字 sockfd 是 SOCK_DGRAM 类型,那么 addr 是默认发送数据报的地址,也是接收数据报的唯一地址。
下面的 C 程序似乎揭示了UNIX 域套接字上connect
/的 Linux 实现中的一个错误recv
,因为它从一个地址 ( @"PWE0"
) 而不是它连接到的地址 ( ) 接收到一条消息@"STAR"
,然后终止。与此相反,我期望的行为是程序不会终止,因为它忠实地等待来自它所连接的地址的消息,而该地址永远不会到达。(我故意没有用返回值检查和打印语句来混淆这个例子,因为它可以很容易地用strace
; 在现实生活中进行检查,调用将由不同的进程进行。)
#include <sys/socket.h>
char header[] = "PLD ";
int main()
{
#define addrlen sizeof(unsigned short) + sizeof (char [1+4]) + sizeof(int)
int fd = socket(PF_UNIX, SOCK_DGRAM, 0);
bind(fd, &(struct sockaddr){ AF_UNIX, "\0PLD " }, addrlen);
int gd = socket(PF_UNIX, SOCK_DGRAM, 0);
bind(gd, &(struct sockaddr){ AF_UNIX, "\0STAR" }, addrlen);
int hd = socket(PF_UNIX, SOCK_DGRAM, 0);
bind(hd, &(struct sockaddr){ AF_UNIX, "\0PWE0" }, addrlen);
sendto(hd, "PWE0\0\0\0\n\1h\0\0\0\1\0\0\0\1", 18, 0,
&(struct sockaddr){ AF_UNIX, "\0PLD " }, addrlen);
connect(fd, &(struct sockaddr){ AF_UNIX, "\0STAR" }, addrlen);
char buf[32];
return recv(fd, buf, sizeof buf, 0);
}
那么,Linux [以及 HP-UX(带有文件系统路径名)] 是否违反了规范,还是我遗漏了什么?