2012-03-29 10 views
0

私はこのプロジェクトで、C++。サードパーティ製のlibを使用してTCPクライアントサーバーアプリケーションを開発中です。recv()apiのパッド付きデータ

ここで、クライアントサーバー間の交換は、プロトコルの形式をよく定義します。クライアントは、解析のために送信するパケットを受信します。解析マネージャは、解析アクティビティを処理します。

私は次の疑いを持っています ネットワークからクライアントにデータが到着すると、OSはアプリケーションがrecv()関数を呼び出すまでそのデータをバッファします。

2つのメッセージmsg1とmsg2がバッファに到着すると、recvの呼び出しはmsg1 + msg2を返します。これにより、解析作業が失敗する可能性があります。

私の質問 1.上記の仮定が正しいかどうか? 2.上記の保証が正しい場合、どのようにしてこの問題を解決できますか。

答えて

0

あなたがここで行うに必要なものRevathy、

は、固定長パケットまたは可変長のデータが続くで、少なくとも固定長ヘッダを作るです。

ヘッダーにはパケットのサイズが含まれている必要があります。したがって、recv関数では、常にヘッダバイトを読み込み、パケットのサイズをデコードし、別のrecvコールを使ってパケットの残りの部分を読み込みます。あなたのTCP層は、パケットの任意の数をバッファリングする際

この方法でも、あなたは、私たちがしているパケットの数を見つけるために、我々は、TCPで作業していると正しく

unsigned char* pBuffer = NULL; 
    pBuffer = new unsigned char[MESSAGE_HEADER_LENGTH]; 

    // reading header from socket 
    int nRet = recv(sock,(char*)pBuffer,MESSAGE_HEADER_LENGTH,0); 
    int nDataLen = //Read the packet length from pBuffer 
    // reading body from socket 

    unsigned char* pPacket = NULL; 
    pPacket= new unsigned char[nDataLen ]; 
    nRet = recv(sock,(char*)pPacket ,nDataLen ,0); 
0

TCPではパケットの境界が見えません。したがって、recv()を呼び出す前に両方のパケットが到着すると、両方のパケットの内容が一度に取得されます。

UDPでは、パケットの境界が保持されるため、recv()を呼び出すたびに1パケットが戻されます。

+0

、plzは私たちの溶液を得、それを読むことができるようになりますrecv()APIを使用して受信します。また、クライアントは常に完全な応答を得るか、ある種類の応答の半分を取得し、残りの半分を別の種類(たとえば、recv()API用に定義したバッファに依存します) – Revathy

+0

半分のパケットを与えることは完全に可能です.TCPは、単一のデータストリームを転送することを前提としています。そのデータの構造は、プロトコル(レコード構造、長さフィールドまたはエスケープ文字)から出てくる必要があります。どのようなプロトコルを実装していますか? –

+0

TCP/IPプロトコル – Revathy

関連する問題