我需要每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)
TCP套接字不保证框架.当您通过TCP套接字发送字节时,这些字节将以相同的顺序在另一端接收,但它们不一定以相同的方式分组 - 它们可以以任何方式分割,组合在一起或重新组合操作系统认为合适.
如果您需要成帧,则需要发送某种数据包标头以指示每个数据块的开始和结束位置.这可以采用定界符(例如,a \n或\0指示每个块结束的位置)或长度值(例如,每个块的头部处的数字来表示它的长度)的形式.
此外,正如其他受访者所指出的那样,sleep()取整数,所以你实际上根本就没有睡觉.