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;
}
最初にヘッダーを読み取り、メッセージを読むのが理想的です。私はこれを一度行うことができますが、私はクライアントが切断するまで、基本的に永遠に、これを何度も繰り返していきたいと思います。
ありがとうございました!助けを求めて!
メモリリークのほかに、表示するコードの問題は何ですか?あなたが望むことはしませんか?それは構築されませんか?予期しない結果が出ますか?あなたが持っている問題について詳しく説明してください。 –
すべてのヘッダーが4バイトであり、4バイトの値が10になると仮定して、私はそうしました。それは構築する!メッセージの一部だけを読み込みます。例えば、私がサーバに "私はC++の初心者です"と言うと、それは 'ヘッダが私です。 メッセージはC++で最後の部分を残す初心者です。 – root
もしあなたがヘッダよりも多くのデータを送るなら送信者が壊れていることを示します。また、ヘッダーの形式は何ですか?それは文字列ですか?バイナリの4バイト整数?受信したデータは、Cスタイルの文字列のようにゼロで終了しますか?ヘッダーから適切な長さを得てそれを使用してメモリリークを修正すれば、コードは正常であるようです。 –