c - 套接字 TCP : Why do I lose messages with scanf

标签 c linux sockets tcp scanf

我在 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 , cd ,客户总能得到其中三个,c是小姐。但是服务器确实发送了四次,因为我得到了四个 message envoye .

编辑
我检查了函数的返回值 read我得到了一些我不明白的东西。 enter image description here

请注意:当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/

相关文章:

linux - hexdump 可以用 ASCII 显示 8 列吗?

媲美WPF的Linux开源2d GUI引擎

linux - 手动在apue中编译代码但出现错误

node.js - 如何在 Node.js 中结合使用 express 和 tcp-socket

C汇编编程

python - 如何设置TCP套接字的初始序列号

c++ - 了解 C 类型定义

c - 给定一个 boolean 表达式,决定在何处放置括号使其变为真

c - 恢复快照后恢复Socket

c - 如何在运行时检测 SO_REUSEPORT 可用性?