1

プロキシ サーバーを構築しようとしています。
クライアントからの受信 -> サーバーへの送信 -> サーバーからの受信 -> クライアントへの送信。

プロキシは、クライアントから正しいデータを受け取ります。
しかしその後、サーバーから 0 バイトを受信しました。

これは、クライアントから受信してサーバーに送信する必要があるパケットです

0A 00 2C 01 23 00 0C 00 B3 01

これが私のコードです。

    //intercept commu by server <-> client

    memset(buffer, 0, buffer_len);

    //recv from client
    if((bytecount = recv(*csock, buffer, buffer_len, 0))== -1){
        fprintf(stderr, "Err: receiving data %d\n", errno);
        return 0;
    }

    //display what we got from the client
    printf("Received bytes %d\n", bytecount);
    for ( int i = 0; i < bytecount; i++ ) {
    printf( "%02x ", static_cast<unsigned char>( buffer[i] ) );
    }
    printf("\n");

    //send to server what we got from the client
    if((gbytecount=send(gsock, buffer, buffer_len, 0))== -1){
    fprintf(stderr, "Error sending data %d\n", errno);
    goto FINISH;
    }


    //recv from server
    if((gbytecount = recv(gsock, buffer, buffer_len, 0))== -1){
        fprintf(stderr, "Error receiving data %d\n", errno);
        return 0;
    }

    printf("Received bytes %d\n", gbytecount);
    for ( int i = 0; i < gbytecount; i++ ) {
    printf( "%02x ", static_cast<unsigned char>( buffer[i] ) );
    }
    printf("\n");   

    //send back to client what we got from the server
    if((bytecount = send(*csock, buffer, buffer_len, 0))== -1){
        fprintf(stderr, "Err: sending data %d\n", errno);
        return 0;
    }

クライアントからの受信後にプロキシがサーバーに送信しているものを確認するにはどうすればよいですか?
そして、私の論理に何か問題がありますか?


アップデート

私は問題を見つけたと思います.buffer_lenが原因です。

これで、recv() バイトは 93 になりました。しかし、サーバーは再び別のパケットを送信します。
コードをどうするか?

現在、私のコードは次のとおりです。

recv from client -> send to server -> recv from server -> send to client.

このコードを次のようにするにはどうすればよいですか

他に転送しますか?


アップデート

解決しなきゃ。ありがとう。

4

3 に答える 3

2

クライアントとサーバーの呼び出しの比率が直接1対1であると想定してブロッキング呼び出しを使用していますが(その逆も同様)、実際のアプリケーションではほとんど確実に当てはまりません。実際には、アプリケーションは、クライアントとサーバーの両方から受信する多数の呼び出しでTCPストリームの一部を受信します。これは、2つの異なる方法で処理できます。select()どのソケットからデータを読み取る必要があるかを確認するために使用するか、非同期ライブラリを使用してクライアント/サーバーソケットとの間の読み取り/書き込みを容易にします。

これはかなり出てくるようですので、この質問に対する私の答えを参照してください: Boostを使用してC++でプロキシサーバーを作成する方法

select()APIを参照してください

または、boostで1つ書く例を次に示します。「boost::asioプロキシサーバー」をグーグルで検索すると、他にも多くの例があります。

于 2012-11-30T21:53:03.810 に答える
2

私はあなたのサーバーとクライアントを知りませんが、サーバーは実際にcloseは の結果として 0 を引き起こすソケットである可能性があります。recv閉鎖の理由は、bytecountクライアントからデータを受信buffer_lenするが、サーバーにデータを送信すると、無効なデータが発生する可能性があるためです。サーバーに送信される有効なデータの後のデータ!

于 2012-11-30T21:15:54.237 に答える
0

BigBossの答えは正しいです:-buffer_lenバイトを送信するのではなく、bytecountバイトをgsockに送信する必要があります。さらに良いことに、可能であればヘッダーからパケットのサイズを読み取り、可能な場合はそのバイト数まで読み取る必要があります

于 2012-11-30T21:53:44.030 に答える