套接字编程问题

时间:2009-10-12 11:11:15

标签: c sockets

我在Unix OS上使用C语言中的套接字编程实现了客户端服务器。我在客户端使用了非阻塞套接字。我想实现双向沟通。但它只能以一种方式工作,即客户端可以在服务器上读写数据,但服务器无法在客户端读取或写入数据。

客户端

nread = recv(sock, ptr, nleft, MSG_DONTWAIT))
send(sock, ptr, nleft, 0))

服务器

recv(sock, ptr, nleft, MSG_DONTWAIT))
SockWrite(sock, Message, dataLength)

服务器在阅读时始终面临问题。谁能解释我为什么以及如何摆脱这个?

3 个答案:

答案 0 :(得分:1)

等待套接字准备好使用select()调用进行读取或写入。

答案 1 :(得分:0)

recv的返回码是什么?您是否将recv套接字设置为非阻塞?在这种情况下,你可能会看到EAGAIN,你需要选择()等,或者回到阻止。我不建议忽略系统调用的返回值。

答案 2 :(得分:0)

代码示例

static void SetNonBlock(const int nSock, bool bNonBlock)
{
    int nFlags = fcntl(nSock, F_GETFL, 0);
    if (bNonBlock) {
        nFlags |= O_NONBLOCK;
    } else {
        nFlags &= ~O_NONBLOCK;
    }

    fcntl(nSock, F_SETFL, nFlags);
}

     ...
     SetNonBlock(sock, true);
     ...
    int code = recv(sock, buf, len_expected, 0);
    if(code > 0) {
            here got all or partial data
    } else if(code < 0) {
        if((errno != EAGAIN) && (errno != EINPROGRESS) ) {
                         here handle errors
        }
              otherwise may try again       
    } else if(0 == code) {
        FIN received, close the socket
    }