2016-04-26 11 views
0

クライアントから送信されたすべてのメッセージを読みたいと思います。 私はtcpサーバを実装しており、データを受信して​​います。各メッセージは、ヘッダーとしてメッセージのサイズによって追加されます。だから私はヘッダーを読んでそれからサイズを見つけて、あとで読むメッセージのための多くのメモリを割り当てることができます。しかし、私のC++への露出は非常に少ないので、これは私が思いついたものです。クライアントから送信されたすべてのメッセージを読み取ることができません

すべてのメッセージの読み方は?

void *dothistask(void *socket_desc) 
{ 
    int sock = *(int*)socket_desc; 
    free(socket_desc); 
    int read_size; 
    unsigned int x = 4; 
    char *header = (char*)malloc(sizeof(char) * 4); 
    char *message; 
    int index = 0; 
    long p; 

    int status; 
    while(true) { 
    status = ReadXBytes(sock, 4, header); 
    if(status == -1) 
    { 
     break; 
    } 
    message = (char *)malloc(sizeof(char) * 10); 
    status = ReadXBytes(sock, 10, message); 
    if(status == -1) 
    { 
     break; 
    } 
    cout<<"The header is "<<header<<endl; 
    cout<<"The message is "<<message<<endl; 
    } 

    return 0; 

} 

int ReadXBytes(int socket, unsigned int x, void* buff) 
{ 
    char *buffer = (char*)buff; 
    int bytesRead = 0; 
    int result; 
    while (bytesRead < x) 
    { 
    result = recv(socket, buffer + bytesRead, x - bytesRead, 0); 
    if(result == 0) 
    { 
     cout<<"Client disconnected"<<endl; 
     fflush(stdout); 
     return -1; 
    } 
    else if(result == -1) 
    { 
     perror("recv failed"); 
     return -1; 
    } 
    bytesRead += result; 
    } 
    return 0; 
} 

最初にヘッダーを読み取り、メッセージを読むのが理想的です。私はこれを一度行うことができますが、私はクライアントが切断するまで、基本的に永遠に、これを何度も繰り返していきたいと思います。

ありがとうございました!助けを求めて!

+0

メモリリークのほかに、表示するコードの問題は何ですか?あなたが望むことはしませんか?それは構築されませんか?予期しない結果が出ますか?あなたが持っている問題について詳しく説明してください。 –

+0

すべてのヘッダーが4バイトであり、4バイトの値が10になると仮定して、私はそうしました。それは構築する!メッセージの一部だけを読み込みます。例えば、私がサーバに "私はC++の初心者です"と言うと、それは 'ヘッダが私です。 メッセージはC++で最後の部分を残す初心者です。 – root

+0

もしあなたがヘッダよりも多くのデータを送るなら送信者が壊れていることを示します。また、ヘッダーの形式は何ですか?それは文字列ですか?バイナリの4バイト整数?受信したデータは、Cスタイルの文字列のようにゼロで終了しますか?ヘッダーから適切な長さを得てそれを使用してメモリリークを修正すれば、コードは正常であるようです。 –

答えて

2

メッセージを読むために、あなたは

ReadXBytes(sock, 10, message); 

を持っているが、それは、ヘッダの内容に応じて、

ReadXBytes(sock, *((int*)header), message); 

のようなものでなければなりません。 10がハードコードされているので、10バイトしか読み取れません。それに応じて、mallocを調整して10バイトを割り当てるだけでなく、

関連する問題