recv()总是返回0

时间:2016-09-15 17:05:50

标签: c++ network-programming winsock2 recv

我遇到recv()函数的问题我无法解释:它总是返回0.我是一个客户端/服务器应用程序,服务器只需要接收一个从客户端通过互联网(不同的PC)的字符串。
没有连接问题,我也尝试从服务器向客户端发送字符串:它工作正常。 我在博客中搜索了我发现的内容,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。我也尝试在同一台机器上运行这两个程序。谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

你有:

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

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