1

0.02 秒ごとに別のプロセスにデータを送信する必要があります。

サーバーコード:

//set socket, bind, listen
while(1){
     sleep(0.02);
     echo(newsockfd);
 } 

void echo (int sock)
{
   int n;
   char buffer[256]="abc";
   n=send(sock,buffer,strlen(buffer),0);
   if (n < 0) error("ERROR Sending");
}

クライアントコード:

//connect
while(1)
{
  bzero(buffer,256);
  n = read(sock,buffer,255);
  printf("Recieved data:%s\n",buffer);
  if (n < 0)
    error("ERROR reading from socket");
}

問題はそれです:

クライアントは次のように表示します。

Recieved data:abc
Recieved data:abcabcabc
Recieved data:abcabc
....

それはどのように起こりますか?スリープ時間を設定すると:

...
sleep(2)
...

それは大丈夫でしょう:

Recieved data:abc
Recieved data:abc
Recieved data:abc
...
4

6 に答える 6

5

TCP ソケットはフレーミングを保証しません。TCPソケットを介してバイトを送信すると、それらのバイトは同じ順序で相手側で受信されますが、必ずしも同じ方法でグループ化されるとは限りません.分割されたり、グループ化されたり、何らかの方法で再グループ化されたりする可能性があります.オペレーティングシステムは適切だと判断します。

フレーミングが必要な場合は、データの各チャンクの開始位置と終了位置を示すために、ある種のパケット ヘッダーを送信する必要があります。これは、区切り文字 (各チャンクの終了位置を示す\nor\0など) または長さの値 (各チャンクの長さを示す各チャンクの先頭の数字) のいずれかの形式を取ることができます。

また、他の回答者が指摘しているように、sleep()は整数を取るため、ここでは実質的にまったく眠っていません。

于 2013-06-09T06:26:42.840 に答える
3

sleepunsigned int引数として取るので、実際sleep(0.02)にはsleep(0)です。

unsigned int sleep(unsigned int seconds);

usleep(20)代わりに使用してください。マイクロ秒単位でスリープします。

int usleep(useconds_t usec);
于 2013-06-09T06:18:17.680 に答える
2

OS は自由にデータをバッファリングできます (つまり、複数のパケットではなく完全なパケットを送信しない理由)。

さらに、スリープは符号なし整数を取ります。

于 2013-06-09T06:23:35.360 に答える
2
sleep(0.02)

効果的に

sleep(0) 

引数は unsigned int であるため、暗黙的な変換が自動的に行われます。ですから、ここではまったく眠れません。sleep(2)2 マイクロ秒のスリープに使用できます。次に、仮にあったとしても、メッセージが別のフレームで送信されるという保証はありません。これが必要な場合は、ある種の区切り記号を適用する必要があります。

'\0'

一部の実装での文字。

于 2013-06-09T07:00:23.607 に答える