У меня есть dll, которая перехватывает функцию recv сетевого приложения. Код работает просто отлично (он делает все, что должен делать), но если я добавляю выходные журналы в файл, соединение закрывается через некоторое время работы (приложение на стороне сервера выдает ошибку «Существующее соединение было принудительно закрыто удаленным хозяин").
Это время даже не всегда одинаково, иногда оно закрывается почти при инициализации соединения, в других случаях я могу использовать соединение в течение нескольких секунд, прежде чем оно будет закрыто. Он не выдает никаких сообщений об ошибках или предупреждений. Если я удалю код журнала, приложение будет работать нормально. Любая идея, почему это происходит? Я запускаю его в Windows 8 x64
Кроме того, даже стирая код журнала, соединение продолжает закрываться в Windows XP x32.
Вот код хука recv:
int __stdcall NewRecv(SOCKET socket, char *data, int datalen, int flags) {
int result = 0;
if(!IsLoginServerPacket(&socket)) {
INT size = 0,opcode = 0,temp = 0,writer = 0,second_op = 0;
do {
size = 0;
second_op = 0;
temp = 0;
writer = 0;
while(temp < 2) {
temp += recvPacket(socket,recv_gs_buffer+writer,2 - temp,flags);
writer += temp;
}
size = (*(SHORT*)recv_gs_buffer) & 0xffff;
// THIS IS THE LOG CODE
FILE *f = fopen("debug.txt", "a");
fprintf(f, "datalen=%d, size=%d\n", datalen, size);
fclose(f);
while(temp < size) {
temp += recvPacket(socket,recv_gs_buffer+writer,size - temp,flags);
writer += temp;
}
Decrypt(&gs_crypt,recv_gs_buffer+2,size-2);
opcode = (*(recv_gs_buffer+2) & 0xff);
if(opcode == EXTENDED_PROTOCOL) {
second_op = *(SHORT*)(recv_gs_buffer + 3);
second_op &= 0xffff;
HandleGameServerPacket(second_op,recv_gs_buffer+2,size-2);
}
} while(second_op == 0x8a || second_op == 0x8b);
if(opcode == 0x00) {
SetKey(recv_gs_buffer+4,&gs_crypt);
SetKey(recv_gs_buffer+4,&client_crypt);
} else
Crypt(&client_crypt,recv_gs_buffer+2,size-2);
int i = 0;
while(i < size) {
data[i] = recv_gs_buffer[i];
i++;
}
//memcpy(data,recv_gs_buffer,size);
result = size;
} else
result = recvPacket(socket,data,datalen,flags);
return result;
}
data[i]
, используяsize
в качестве длины блока, для которой установлено значение 0xffff. - person Devolus   schedule 04.08.2013