【问题标题】:recv() returns always 0recv() 总是返回 0
【发布时间】:2016-09-15 17:05:50
【问题描述】:

我无法解释 recv() 函数的问题:它总是返回 0。我有一个客户端/服务器应用程序,其中服务器只需通过互联网从客户端接收字符串(不同的电脑)。
没有连接问题,我还尝试从服务器向客户端发送一个字符串:它有效。 我在博客中搜索,我发现了什么,recv() socket function returning data with length as 0non-blocking recv returns 0 when disconnectedRecv returning zero incorrectly,并没有帮助我理解。

我在这里发布 Network 类: 网络.h

    class Network
    {
        WSADATA wsaData;
        WORD wVersionRequested;
        int Port;
        unsigned int byteReceived, byteSent; 
        SOCKET listeningSocket, connectedSocket; 
        SOCKADDR_IN serverAddr, senderInfo, clientAddr;
        int caddrlen;

    char buff[DIM];
    string buffer;
    public:
        Network();
        ~Network();

    void Recv();
};


Network.c

void Network::Recv() {
    int n = recv(connectedSocket, buff, strlen(buff), 0);

    setByteReceived(n);
    buffer.assign(buff, n);
    cout << "Buffer is: " << buff << endl; 
    if (byteReceived == 0)
        cout << "\tConnection closed" << endl;
    else if (byteReceived > 0) {
        cout << "\tByte received: " << byteReceived << endl;
        cout << getBuffer() << endl;
    }
    else {
        myFormatMessage(WSAGetLastError());
    }
}


最终的行为如下:客户端和服务器连接,服务器从recv()返回0。我还尝试在同一台机器上运行这两个程序。感谢您的帮助。

【问题讨论】:

  • 你知道recv()到底是怎么收到0的?
  • 我没有说 :) 我只知道 recv() 返回 0。我也尝试使用 wireshark 来跟踪网络流量,但我遇到了一些问题。这种行为似乎与 Linux 不同,即使以管理员身份运行程序,我也看不到环回接口。我不知道错误可能出在哪里。

标签: c++ network-programming winsock2 recv


【解决方案1】:

你有:

void Network::Recv() {
    int n = recv(connectedSocket, buff, strlen(buff), 0);
    ...

如果 strlen(buff) 返回 0(因为 buff 在索引 0 处包含一个空字节),您将要求 recv() 读取 0 个字节,因此它将返回 0 个字节。您应该使用sizeof(buff) 而不是strlen(buff)

【讨论】:

  • buff 是我保存从客户端发送的内容的缓冲区。我知道发送者关闭连接时 <pre>recv 返回 0。正确的?我认为客户端不能发送 0 字节..
  • recv 的第三个参数是您的buff 有多大,以便recv 知道何时不溢出buff。但是你将0 传递给recv,所以它不会读取任何字节。
  • 我编写了另一个没有 Network 类的程序,使用相同的参数调用 recv 并且它可以工作。我的意思是该字符串是一个类似 C 的字符串,在调用 recv 之前,其中没有任何内容。 (如何在评论中使用代码格式?
     不起作用..谢谢)
  • 如果buff 是零长度字符串...。有关格式,请参阅 markdown 文档。
  • strlen(buff) 如果buff 以空字节开头,则返回 0。 从不使用strlen() 来获取输入缓冲区的大小。您需要告诉recv() buff 的实际大小。由于buff 是一个静态数组,因此您可以使用sizeof(buff)
猜你喜欢
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 2015-09-27
  • 2014-03-20
  • 2013-04-13
  • 2013-03-30
  • 2016-07-13
  • 2023-04-09
相关资源
最近更新 更多