【问题标题】:Socket Programming Problem套接字编程问题
【发布时间】:2009-10-12 11:11:15
【问题描述】:

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

服务器在读取时总是遇到问题。谁能解释一下为什么以及如何摆脱这种情况?

【问题讨论】:

  • 发布完整的源代码将增加您收到答案的机会。
  • 您能否澄清一下-您的意思是客户端可以“从服务器接收数据”和“向服务器发送数据”?如果是这种情况,那么您的服务器似乎能够从客户端发送/接收数据。
  • 是的,我想要客户端和服务器之间的双向通信。

标签: c sockets


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    代码示例

    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
        }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-06
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多