-4

Cで実装されたサーバーからクライアントに文字列メッセージを送信しています。これを行うには、最初にメッセージの長さを送信し、次に実際のメッセージを送信します。以下は私のサーバーからのコードスニペットです。

int length = strlen(message);
send(serversock, &length, sizeof (int), 0);
send(serversock, message, sizeof (char) * length, 0);

以下は私のクライアントのコードです:

int length;
recv(clientsock, &length, sizeof (int), 0);

printf("size: %d\n", length);

char* message;
recv(clientsock, message, sizeof (char) * length, 0);
printf("Got Message %s\n", message); // I get Segmentation Fault here

メッセージを受け取ったら、印刷してみます。ただし、セグメンテーション違反が発生します。誰か助けてくれませんか?

PS:私は長さの値を取得することができます

4

3 に答える 3

2
char* message;
recv(clientsock, message, sizeof (char) * length, 0);

messageポイントするためにメモリを割り当てる必要があります。messageここでは、ポインターの初期化されていない値を渡しています。malloc配列を割り当てるために使用します。文字列であると仮定messageします:

char *message = malloc(length + 1);
于 2013-03-11T21:49:56.300 に答える
1

recvはメモリを割り当てません。明示的に行う必要があります。

int length;
recv(clientsock, &length, sizeof (int), 0);

printf("size: %d\n", length);

char* message = malloc(length+1); /* read into here */
recv(clientsock, message, sizeof (char) * length, 0);
message[length] = '\0'; /* nul terminated for printing */
printf("Got Message %s\n", message);
free(message); /* and remember you own this buffer */

長さを読み取るときは、既に存在する変数を読み取っていますint length;。整数用のスペースを予約しています。

ただし、メッセージを読むときに、初期化されていないポインターを使用したため、メッセージをランダムな場所に書き込もうとしました (したがってクラッシュ):ポインターchar *message;用のスペースのみを予約します。

最近の C コンパイラでは、次を使用できることに注意してください。

char message[length+1];

代わりは。この方法では、配列を明示的に指定する必要はありませんがfree、配列lengthが大きすぎると、失敗を適切に処理する機会がありません。

于 2013-03-11T21:50:58.080 に答える
0

さて、どうやって

send(serversock, &size, sizeof (int), 0);

メッセージのサイズを送信することを表しますか?

クライアント コードでは、長さは初期化されず、「メッセージ」にメモリを割り当てていません。関連するすべてのコードを表示していますか。その場合、割り当てられていない char* メッセージは、recv の呼び出し後にランダムなメモリ位置を確実に上書きします。

于 2013-03-11T21:52:29.570 に答える