0

ネットワーク アプリケーションの recv 関数をフックする dll があります。コードは正常に動作します (実行することになっているすべてのことを行います) が、出力ログをファイルに追加すると、しばらくすると接続が閉じます (サーバー側アプリケーションは、「既存の接続がリモートによって強制的に閉じられました」というエラーをスローします)。ホスト")。

その時間は常に同じではありません。接続を初期化するときにほとんど閉じることもあれば、閉じる前に数秒間接続を使用できることもあります。エラーや警告メッセージは表示されません。ログ コードを削除すると、アプリケーションは正常に動作します。なぜそれが起こっているのですか?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;
}
4

1 に答える 1

0

問題とその解決策を見つけました。

挿入されたアプリは、非ブロッキング モードでソケットを構成していました。少しでも遅れると、WSAEWOULDBLOCK (10035 エラー コード) がスローされていました。それを修正するために私がしなければならなかったのは、エラーが発生した場合にrecvリクエストを再試行することだけでした

INT val = 0;
while(temp < 2) {
    val = recvPacket(socket,recv_gs_buffer+writer,2 - temp,flags);
    if(val > 0) {
        temp += val;
                writer += temp;
    }
}

val = 0;
while(temp < size) {
    val = recvPacket(socket,recv_gs_buffer+writer,size - temp,flags);
    if(val > 0) {
        temp += val;
                writer += temp;
    }
}
于 2013-08-05T12:04:56.037 に答える