我正在做一个代理服务器,每当我从这里使用这个recv()循环时:Winsock recv() does not block recv()函数总是返回-1,所以它退出循环并且永远不会收到任何东西。
int System::receive(SOCKET &recvSocket)
{
char buffer[4096] = { 0 };
int numBytes;
do {
numBytes = recv(recvSocket, buffer, 4095, 0);
//lastReceived = lastReceived + buffer;
//get recent contents of buffer
cout << numBytes << endl;
if (numBytes > 0)
{
cout << buffer << endl;
continue;
}
if (numBytes == 0)
{
std::cout << "Client disconnected!" << std::endl;
break;
}
int nError = WSAGetLastError();
cout << nError << endl;
if (nError != WSAEWOULDBLOCK)
{
std::cout << "Winsock error code: " << nError << std::endl;
break;
}
} while (1);
return numBytes;
}
使用非阻塞套接字调用main的代码:
SOCKET establishedConn = Server.acceptSocket(listenSocket);
u_long iMode = 1;
if (establishedConn != NULL) {
ioctlsocket(establishedConn, FIONBIO, &iMode);
Server.receive(establishedConn); //receive request from client
}
有什么理由不退货吗?
答案 0 :(得分:0)
由于您没有提供nError
的值,因此无法确定,但它可能是EWOULDBLOCK,这意味着没有数据,这几乎是不可避免的,因为您有非套接字阻止模式,你没有使用select()
并且你在硬循环中阅读。
重构你的接收方法以正确使用非阻塞模式,或保持原样并使用阻塞模式,这似乎是你的意图,无论如何给定代码结构。