高频插座通信

win*_*noi 1 c c++ sockets

我需要每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");
}
Run Code Online (Sandbox Code Playgroud)

客户代码:

//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");
}
Run Code Online (Sandbox Code Playgroud)

问题是:

客户端显示如下内容:

Recieved data:abc
Recieved data:abcabcabc
Recieved data:abcabc
....
Run Code Online (Sandbox Code Playgroud)

怎么会发生?当我设置睡眠时间时:

...
sleep(2)
...
Run Code Online (Sandbox Code Playgroud)

没关系:

Recieved data:abc
Recieved data:abc
Recieved data:abc
...
Run Code Online (Sandbox Code Playgroud)

dus*_*uff 5

TCP套接字不保证框架.当您通过TCP套接字发送字节时,这些字节将以相同的顺序在另一端接收,但它们不一定以相同的方式分组 - 它们可以以任何方式分割,组合在一起或重新组合操作系统认为合适.

如果您需要成帧,则需要发送某种数据包标头以指示每个数据块的开始和结束位置.这可以采用定界符(例如,a \n\0指示每个块结束的位置)或长度值(例如,每个块的头部处的数字来表示它的长度)的形式.

此外,正如其他受访者所指出的那样,sleep()取整数,所以你实际上根本就没有睡觉.