【发布时间】:2017-01-01 10:45:27
【问题描述】:
我在 Mac OS 中用 c 创建了一个服务器和一个客户端。
他们所做的很简单:服务器发送消息,客户端接收消息。
但是我不知道为什么,但是当我在scanf 的帮助下输入多条消息时,我总是会丢失一些消息。
以下是主要代码:
// client
char msg[200];
while(1)
{
if(read(sockclient, msg, sizeof(msg)) <= 0)
{
break;
}
printf("Message recu: %s\n", msg);
bzero(msg, 200);
}
// server
while(1)
{
lg=sizeof(coord_client);
newsockfd=accept(sockserveur,(struct sockaddr*)&coord_client,(socklen_t *)&lg);
char msg2[100];
while(1)
{
scanf("%s",msg2);
write(newsockfd,msg2,sizeof(msg2));
printf("message envoye\n");
bzero(msg2, sizeof(msg2));
}
}
问题是:如果我一一输入消息,例如a<Enter>、b<Enter>,一切都很好。但是,如果我一次输入多条消息,我总是会丢失其中的一些。例如,如果我输入a b c d<Enter>,表示我要发送四个消息:a、b、c 和d,客户端总是可以得到其中三个,c 是miss。但是服务器确实发送了四次,因为我收到了四个message envoye。
编辑
我检查了函数read 的返回值,我得到了一些我不明白的东西。
请注意:当read返回200而不是100时,客户端会丢失以下消息。
【问题讨论】:
-
BUF的大小是多少?一侧有 100 个,另一侧有BUF。 -
你应该检查
read()的返回值。它可能不会返回整个消息大小,它允许返回小于您指定的值。 -
另外,不需要发送整个缓冲区:
strlen(msg2)+1足以发送字符串 + 终止 -
TCP 不保留消息边界,它只是一个字节流。因此,当服务器发送两个 100 字节的消息时,如果请求 200 字节,服务器可以读取它们。
-
它也可以返回 less 比你要求的。它可能第一次返回 50 个字节,下一次返回 150 个字节,而不是返回 100 个字节。