我在 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
是小姐。但是服务器确实发送了四次,因为我得到了四个 message envoye
.
编辑
我检查了函数的返回值 read
我得到了一些我不明白的东西。
请注意:当read
返回 200
而不是 100
,客户端将丢失以下消息。
最佳答案
嗯,读 200 个字节但写 100 个字节很简单。有时在客户端读取之前有两次写入。所以它连续读取了两条消息。
char msg[101];
size_t i = 0;
ssize_t ret;
while (i < 100 && (ret = read(sockclient, msg + i, sizeof msg - i - 1)) <= 0)
{
i += (size_t)ret;
}
if (i == 100) {
msg[100] = '\0';
printf("Message recu: %s\n", msg);
}
关于c - 套接字 TCP : Why do I lose messages with scanf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41414891/