如何从/向SOCK_SEQPACKET套接字读/写?

时间:2014-01-02 13:58:35

标签: linux sockets

我尝试使用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是否是正确的函数。

2 个答案:

答案 0 :(得分:1)

发生错误时

recvmsg()返回-1 - errno将设置为错误编号。

请在此处阅读:http://pubs.opengroup.org/onlinepubs/009695399/functions/recvmsg.html

答案 1 :(得分:1)

SOCK_SEQPACKET是面向连接的,因此您必须首先接受连接,然后在接受的客户端套接字上执行IO。