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