端口转发程序出错,请懂的人指点一下。
annhf 2013-06-25 05:58:29 以下源码是端口转发程序,数据转发的源码,在转发时小数据不会出现问题,但是在大数据时程序程序会出错,显示错误信息为WARN:Close socket.不知道为什么,请各位大虾指点。如果分数不够可以增加。
DWORD WINAPI TranslateData(LPVOID pvParam)
{
STACK<SOCKS> *SocketData = (STACK<SOCKS>*)pvParam;
SOCKS AccAndMapSocket = SocketData->Pop();
WSAEVENT hEvents[2];
hEvents[0] = WSACreateEvent();
hEvents[1] = WSACreateEvent();
if (WSAEventSelect(AccAndMapSocket.AccSocket, hEvents[0], FD_READ | FD_CLOSE))
{
printf("ERROR:WSAEventSelect 1 error.\r\n");
goto error;
}
if (WSAEventSelect(AccAndMapSocket.MapSocket, hEvents[1], FD_READ | FD_CLOSE))
{
printf("ERROR:WSAEventSelect 2 error.\r\n");
goto error;
}
while (1)
{
WaitForMultipleObjects(2, hEvents, false, INFINITE);
WSANETWORKEVENTS WsaEvents[2];
WSAEnumNetworkEvents(AccAndMapSocket.AccSocket, hEvents[0], &WsaEvents[0]);
WSAEnumNetworkEvents(AccAndMapSocket.MapSocket, hEvents[1], &WsaEvents[1]);
int nRecv, nSend;
char buff[8192];
if (WsaEvents[0].lNetworkEvents & FD_READ)
{
nRecv = recv(AccAndMapSocket.AccSocket, buff, sizeof(buff), 0);
nSend = send(AccAndMapSocket.MapSocket, buff, nRecv, 0);
if (nRecv == SOCKET_ERROR || nSend == false)
{
printf("ERROR:Translate listen socket data error.\r\n");
break;
}
}
if (WsaEvents[1].lNetworkEvents & FD_READ)
{
nRecv = recv(AccAndMapSocket.MapSocket, buff, sizeof(buff), 0);
nSend = send(AccAndMapSocket.AccSocket, buff, nRecv, 0);
if (nRecv == SOCKET_ERROR || nSend == false)
{
printf("ERROR:Translate listen socket data error.\r\n");
break;
}
}
if ((WsaEvents[0].lNetworkEvents & FD_CLOSE) || (WsaEvents[1].lNetworkEvents & FD_CLOSE))
{
printf("WARN:Close socket.\r\n");
break;
}
}
error:
g_nAcceptCount--;
closesocket(AccAndMapSocket.AccSocket);
closesocket(AccAndMapSocket.MapSocket);
return 0;
}