套接字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>,这意味着我要发送四条消息:abcd,客户总能得到他们三个,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);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么Go套接字比C ++套接字慢?

为什么Java从套接字读取随机数而不从整个消息读取?

立即写入后,golang tcp套接字不发送消息

Spring任意消息传递TCP套接字

为什么套接字实现比请求慢?

为什么我们必须在TCP服务器套接字编程中获得两个文件描述符?

为什么与Web套接字聊天时需要消息队列?

为什么TCP套接字编程需要两个套接字(一个欢迎套接字和一个连接套接字),而UDP只需要一个套接字?

为什么我的Unix域套接字无法正常工作

为什么在WSASetSocketSecurity()之后我的套接字connect()失败?

我的json应该是什么样的?使用Web套接字发送消息

区分消息python3 tcp套接字

为什么我的套接字onsubscribe事件不被使用?

为什么将TCP / IP套接字视为“打开文件”?

为什么Android仅在c#tcp套接字上收到2896个字节?

Python套接字-为什么在发送多个消息后关闭连接?

除非我不休眠线程,为什么我会丢失40%的系统日志消息?

Python 2.7.8:套接字-TCP套接字中的客户端服务器数据丢失

为什么我的服务器PrintWriter.println()无法通过套接字发送其消息?

为什么“ Wireshark”启动后PF_PACKET RAW套接字会停止丢失数据包?

我们如何知道在tcp套接字上读取的前4个字节是消息的长度?

为什么非阻塞TCP套接字会在:: write()调用中花费大量时间?

通过原始套接字进行 TCP 握手,为什么 recvfrom 挂起?

为什么我的客户端套接字输入流没有接收从服务器套接字输出流发送的消息

在保持客户端套接字打开以发送多条消息时,为什么在消息延迟很大时程序会报错?

为什么我在通过 python 中的套接字传输文件时丢失字节?

为什么我不能用 Java 从两台 PC 连接我的套接字?

为什么我的 TCP 套接字需要很长时间才能读取响应?

为什么我的套接字进入无限循环?