recv() returns 始终为 0
recv() returns always 0
我无法解释 recv()
函数的问题:它总是 returns 0。我有一个 client/server 应用程序,其中服务器只需要通过互联网(不同的电脑)从客户端接收一个字符串。
没有连接问题,我也尝试从服务器向客户端发送一个字符串:成功了。
我在博客中搜索,发现的内容 recv() socket function returning data with length as 0, non-blocking recv returns 0 when disconnected, Recv returning zero incorrectly 对我的理解没有帮助。
这里我 post 网络 class:
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());
}
}
最终的行为如下:客户端和服务器已连接,服务器 returns 来自 recv() 的 0。我还尝试 运行 在同一台机器上运行这两个程序。感谢您的帮助。
您有:
void Network::Recv() {
int n = recv(connectedSocket, buff, strlen(buff), 0);
...
如果 strlen(buff)
returns 0(因为 buff
在索引 0 处包含一个空字节),您将要求 recv()
读取 0 个字节,因此它将 return 0 字节。您应该使用 sizeof(buff)
而不是 strlen(buff)
。
我无法解释 recv()
函数的问题:它总是 returns 0。我有一个 client/server 应用程序,其中服务器只需要通过互联网(不同的电脑)从客户端接收一个字符串。
没有连接问题,我也尝试从服务器向客户端发送一个字符串:成功了。
我在博客中搜索,发现的内容 recv() socket function returning data with length as 0, non-blocking recv returns 0 when disconnected, Recv returning zero incorrectly 对我的理解没有帮助。
这里我 post 网络 class: 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());
}
}
最终的行为如下:客户端和服务器已连接,服务器 returns 来自 recv() 的 0。我还尝试 运行 在同一台机器上运行这两个程序。感谢您的帮助。
您有:
void Network::Recv() {
int n = recv(connectedSocket, buff, strlen(buff), 0);
...
如果 strlen(buff)
returns 0(因为 buff
在索引 0 处包含一个空字节),您将要求 recv()
读取 0 个字节,因此它将 return 0 字节。您应该使用 sizeof(buff)
而不是 strlen(buff)
。