1

我已经在 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)

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

4

3 回答 3

1

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

于 2009-10-12T11:41:31.590 回答
0

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

于 2009-10-12T11:51:58.357 回答
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
    }
于 2009-10-12T12:29:23.833 回答