Я пишу игру, в которую играю по локальной сети с сокетом. Я использую префикс длиной 4 байта, чтобы узнать, сколько данных в остальных, например:
void trust_recv(int sock, int length, char *buffer)
{
int recved = 0;
int justRecv;
while(recved < length) {
justRecv = recv(sock, buffer + recved, length - recved, 0);
if (justRecv < 0) return;
recved += justRecv;
}
}
void onDataArrival(int sock)
{
int length;
char *data;
trust_recv(sock, 4, (char *) &length);
data = new char[length];
trust_recv(sock, length, data);
do_somethings_with_data(data);
}
Проблема в том, что если кто-то (например, злоумышленник или хакер) отправляет данные в другом формате (может быть, всего 2 байта или длина оставшейся части меньше значения префикса 4 байта) или возникает проблема с сетью, мое приложение перейдет в «не отвечает» "состояние и нужно закрыть (потому что я использую блокирующий сокет). Как сделать мое приложение сокета более гибким, но не переключать сокет в неблокирующий режим, чтобы решить эту проблему? (Или любые идеи для организации данных или алгоритмов)
sizeof(int)
не может быть4
. Вы должны использоватьint32_t
иsizeof(length)
для защиты от повреждения стека. - person James McLaughlin   schedule 21.01.2013