我尝试使用SOCK_SEQPACKET套接字:
int rc, len;
int worker_sd, pass_sd;
char buffer[80];
struct iovec iov[1];
struct msghdr msg;
memset(&msg, 0, sizeof(msg));
memset(iov, 0, sizeof(iov));
iov[0].iov_base = buffer;
iov[0].iov_len = sizeof(buffer);
msg.msg_iov = iov;
msg.msg_iovlen = 1;
if((socket_fd = socket(AF_UNIX, SOCK_SEQPACKET, 0)) < 0)
{
perror("server: socket");
exit -1;
}
memset(&server_address, 0, sizeof(server_address));
server_address.sun_family = AF_UNIX;
strcpy(server_address.sun_path, "/mysocket");
unlink("/mysocket");
if(bind(socket_fd, (const struct sockaddr *) &server_address, sizeof(server_address)) < 0)
{
close(socket_fd);
perror("server: bind error");
return 1;
}
while(1)
{
printf("wait for message\n");
bytes_received = recvmsg(socket_fd, &msg, MSG_WAITALL);
printf("%d bytes\n", bytes_received);
}
问题是进程不会等待但是从recvmsg接收-1并永远循环。在联机帮助页中没有任何参考资料应该与SOCK_SEQPACKET样式的套接字一起使用,例如我不确定recvmsg是否是正确的函数。
答案 0 :(得分:1)
recvmsg()
返回-1 - errno
将设置为错误编号。
请在此处阅读:http://pubs.opengroup.org/onlinepubs/009695399/functions/recvmsg.html
答案 1 :(得分:1)
SOCK_SEQPACKET是面向连接的,因此您必须首先接受连接,然后在接受的客户端套接字上执行IO。