繁体   English   中英

套接字TCP:为什么我用scanf丢失消息

[英]socket TCP: Why do I lose messages with 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> ,一切都很好。 但是,如果我一次键入多个消息,我将始终会丢失其中一些消息。 例如,如果我键入abc d<Enter> ,这意味着我要发送四个消息: abcd ,则客户端始终可以获取其中三个消息,而c是miss。 但是服务器确实发送了四次,因为我收到了四个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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM