Есть код следующего содержания, который перенаправляет данные с UDP порта на TCP на другой машине
int CUdp2Tcp::ConvertData()
{
char Buffer[1024];
//Ïîëó÷èëè ñîîáùåíèå SQL
int ret = recv(s_UDP,Buffer,sizeof(Buffer),0);
if (ret == SOCKET_ERROR)
{
ret = WSAGetLastError();
SendMessage(DebugEdit.GetHandle(),LB_ADDSTRING,0,(LPARAM)"Îøèáêà ôóíêöèè recv() !!!");
return ret;
}
ret = send(s_Inbound,Buffer,sizeof(Buffer),0);
if (ret == SOCKET_ERROR)
ret = WSAGetLastError();
else
{
// первый счетчик
PacketsNum++;
}
if (ret)
{
switch (ret)
{
//Socket operation on non-socket.
case WSAENOTSOCK:
return 0;
break;
//reset by peer
case WSAECONNRESET:
closesocket(s_Inbound); //Ïîñëå ýòîãî îïåðàöèè ñ ñîêåòîì áóäåò âûçûâàòüñÿ WSAENOTSOCK
ClosedConnection();
break;
default:
char* CfgLine = new char[1024];
if (GetCfgData("Errors",CfgLine))
{
if (IsOn(CfgLine))
{
char chrret[16];
itoa(ret,chrret,10);
SendMessage(DebugEdit.GetHandle(),LB_ADDSTRING,0,(LPARAM)chrret);
}
}
delete [] CfgLine;
break;
}
}
return ret;
}
Второй счетчик стоит в программе-клииенте, который вызывается по FD_READ.
Вопрос следующий: почему между ними есть расхождения? Клиент получает на каждую тысячу счетчика в сервере еще дополнительно где-то 70 пакетов. Соответственно, что считает один, а что другой и как этого можно избежать?