Witam,
ostatnio piszę program do obsługi protokołu pewnej gry, i trafiłem an cholerny problem po za jej protokołem, a mianowicie na sockecie:
Jest taki problem, że gdy dostanę lagga (dajmy na to chwilowe zamulenie neta) recv odbiera tylko jeden lub żaden pakiet z których powinien być kilka dodatkowych (gubie pakiety) i wszystko szlak trafia, bo program zaczyna się mylić.
Sprawdzałem to na samej grze i snifferze pakietów, gdy zamuliłem neta i odmuliłem po chwili dostał wszystkie pakiety które w czasie zamulenia wystąpiły a mój program w takiej chwili odbierze jeden (pierwszy - algo w ogóle).
Całe odbieranie mam na wątku z boosta, a tworzenie połączenia wygląda tak:
if (WSAStartup(MAKEWORD(2,0), &wsaData)==0)
{
LoginSocket = INVALID_SOCKET;
sockAddr.sin_family = AF_INET;
sockAddr.sin_port = htons(port);
sockAddr.sin_addr.s_addr = inet_addr(host.c_str());
LoginSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(connect(LoginSocket, (struct sockaddr*)&sockAddr, sizeof(sockAddr))!=SOCKET_ERROR)
{
//tutaj bleble zrob cos.
}
}
Odbieranie to funkcja void na wątku razem z parsowaniem:
boost::thread thrd1(boost::bind(&Network::onReceive,this));
void Network::onReceive()
{
unsigned char recvBuffer[8096];
while(true)
{
packet_size = 0;
int iResult = recv(LoginSocket, (char*)recvBuffer, sizeof(recvBuffer), 0);
if (iResult > 0)
{
//bleble
}
}
}
Nie wiem naprawdę co jest, a dobry z winsocka nie jestem.