Recv()总是返回0
recv() returns always 0
我有一个recv()
函数的问题,我无法解释:它总是返回0。我有一个客户端/服务器应用程序,其中服务器只需通过互联网(不同的pc)从客户端接收字符串。
没有连接问题,我也试图从服务器发送一个字符串到客户端:它工作。我在博客中搜索,我发现,recv()套接字函数返回长度为0的数据,非阻塞recv在断开连接时返回0,recv不正确地返回零,没有帮助我理解。
我在这里张贴网络类: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。我还尝试在同一台机器上运行这两个程序。谢谢你的帮助。
你有:
void Network::Recv() {
int n = recv(connectedSocket, buff, strlen(buff), 0);
...
如果strlen(buff)
返回0(因为buff
在索引0处包含一个空字节),您将要求recv()
读取0字节,因此它将返回0字节。您应该使用sizeof(buff)
而不是strlen(buff)
。
相关文章:
- 在 Linux 中关闭 UDP 套接字后,recv 不会返回
- 为什么套接字中的 recv() 函数不返回任何内容?
- 设置SO_RCVTIMEO时,为什么recv返回-1并且errno=EINTR
- TCP套接字(客户端-服务器)recv()返回-1值
- 为什么 sys 套接字 recv 函数不填充数据但返回字节长度?
- C++ 即使数据可用,Windows recv() 也不会返回
- Linux 套接字 recv 返回 -1,errno 110 连接超时
- TCP 服务器/客户端:客户端 recv() 返回空白缓冲区
- 如果send()返回x字节,则recv()在一个呼叫中获取相同数量的字节
- c++winsock-recv()返回不正确且奇怪的缓冲区
- Winsock recv() 返回不正确的数据
- 找到0x0000字节后的recv返回
- C++ WinSock Recv 在接收 0 数据时终止线程而不是返回错误代码
- 带有 MSG_PEEK 的 C 'recv'不返回 -1
- Recv 未返回足够的字节(二进制 http 响应)
- 带有 MSG_PEEK 的 recv() 显示完整消息,但正常返回'would block'
- 为什么 select() 返回 1 而 recv() 返回 0
- setsockopt() 在设置大套接字 recv 缓冲区时不返回错误
- TCP Recv使用select()返回1字节读取
- 为什么对recv的Overlapped调用返回ERROR_NO_MORE_ITEMS(259) ?