嗨,我
正在做代理服务器,每当我从这里使用此 recv(( 循环时:Winsock recv(( 不会阻塞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
}
有什么理由不返回任何东西吗?
由于您没有提供nError
的值,因此无法确定,但它可能是 EWILLBLOCK,这意味着没有数据,这几乎是不可避免的,因为您的套接字处于非阻塞模式并且您没有使用select()
并且您正在硬循环中读取。
要么重构你的接收方法以正确使用非阻塞模式,要么保持原样并使用阻塞模式,这似乎是你的意图,无论如何,考虑到代码结构。