【问题标题】:How to bring syncronization between client and server如何在客户端和服务器之间实现同步
【发布时间】:2012-02-02 09:07:34
【问题描述】:

我的服务器正在向客户端发送数据包,但没有显示第二个数据包。 如果我的套接字是阻塞类型的,我不知道为什么会发生这种情况。

     while(1){
             memset(buf,0,1024);
             numbytes=0;

             if ((numbytes = recv(sockfd, buf, 1024, 0)) == -1) {
                  perror("recv");
                  exit(1);
                 }
             buf[numbytes] = '\0';
             printf("%s\n",buf);
             fflush(stdout);
            }
  fclose(fp);
  close(sockfd);

【问题讨论】:

  • 你是什么意思尝试接收两次?你能澄清你的问题吗?
  • Wireshark 是一个方便的工具,可以在这些情况下为您提供帮助
  • 这意味着 while 循环正在迭代两次,第一次我得到了我从服务器发送的数据,第二次它唯一的,null 但据我说它应该阻止并等待数据来自服务器端。
  • 第二次运行中的numbytes 是什么?也许将printf("%s\n",buf); 替换为printf("%d %s\n", numbytes, buf);。此外,如果您限制对0..numbytes 的访问,则不需要memset(buf,0,1024);。还有其他缺陷......
  • 有几件事: 1,循环是无限的,你永远不会打破它。 2、你不检查关闭的连接(numbytes == 0)。 3、对recv的调用将返回一旦数据被复制到缓冲区,即使它只是一个字节。

标签: c sockets posix


【解决方案1】:

这可能是因为您的服务器正在发送一个空字符串。因此,您的客户端不会因为收到 '\0' 字符而阻塞,并且它不会打印任何内容,因为它是一个空字符串。

第二个原因可能是您的服务器关闭了连接。在这种情况下,numbytes 的值为零,您的客户端将不会打印任何内容,因为您的缓冲区中也会出现一个空字符串。

您的代码的一个问题是,如果服务器发送 1024 字节或更多字节,numbytes 将等于 1024,如果您的缓冲区大小也等于 1024,则表达式 buf[numbytes] 将导致分段错误。您可以通过接收 1023 而不是 1024 来防止此问题。

【讨论】:

  • 或者他可以将数据视为字节,而不是字符串。他可以试试printf("%.*s", numbytes, buf)fwrite(buf, 1, numbytes, stdout)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
  • 2012-09-26
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多