ソケットが確立されたTCPサーバーとクライアントがあります。次のような場合があるとしましょう。
サーバ:
char *fn = "John";
char *ln = "Doe";
char buffer[512];
strcpy(buffer, fn);
send(*socket, buffer, strlen(buffer), 0);
strcpy(buffer, ln);
send(*socket, buffer, strlen(buffer), 0);
クライアント:
char *fn;
char *ln;
char buffer[512];
bytes = recv(*socket, buffer, sizeof(buffer), 0);
buffer[bytes] = '\0';
strcpy(fn, buffer);
bytes = recv(*socket, buffer, sizeof(buffer), 0);
buffer[bytes] = '\0';
strcpy(ln, buffer);
printf("%s", fn);
printf("%s", ln);
期待される結果:各文字列を個別に受け取りたい(異なる変数に保存しているため)代わりに、最初のrecv()がfn"John"とln"Doe"の両方を連結した"JohnDoe"を取得し、プログラムがスタックします2番目のrecv()...すでに送信を行っているので。
私は次のことを試みました:-次のようにfnおよびln文字列に\0を追加します。
char *fn = "John\0";
char *ln = "Doe\0";
しかし、問題は解決しませんでした。
各文字列が別々に受信されるように課すことができる何らかの条件はありますか?
編集してさらに質問を追加します:
1)ある場合には実際に別々に送信し、他の場合には一緒に送信するのはなぜですか?
2)代わりにsend()とrecv()を使用する必要がありますか?私のコードの他のいくつかの部分では、それは自己調整であり、私がチェックする必要なしに適切なタイミングで適切な文字列を受け取るだけのようです。これでうまくいきますか?
3)送信しようとしている文字列の長さのヘッダーを送信することについて、着信文字列を解析してどこで分割するかを知るにはどうすればよいですか?どんな例でも素晴らしいでしょう。
4)バッファを指してくれてありがとう、バッファよりも大きくなっているのかどうかを確認します。
編集2:
5)私は常にサイズ512のバッファchar配列に物を入れているので、1文字の文字列を送信している場合でも、すべての送信操作でバッファのフルサイズを取るべきではありませんか?それは紛らわしいことです。私は「ジョン」を持っていますが、サイズ512の配列に入れて送信していますが、送信バッファーがいっぱいになることはありません。そのため、recv()関数は、サイズの配列全体をプルすることでネットワークバッファーを空にします。 512?