c++ - 关于发送/接收的问题

标签 c++ networking sockets

套接字编程的新手。有几个问题:

我的程序确实与其输出不一致。有时我的客户会收到,有时不会。我也每次都使用相同的输入。

  1. 只需要确认:接收到的字节数是否可以小于服务器发送的字节数?

  2. 如何才能在我拥有所需的所有字节后停止接收?

  3. 有没有办法让客户端知道它“将要”接收多少字节,以便我可以将 recv 置于 while 循环中?

感谢大家抽出宝贵时间 :) 如果重要的话,用 C++ 执行此操作/非阻塞。

最佳答案

  1. 假设这是 TCP(而非 UDP),您可以将套接字视为字节流。发件人可以想要的任何方式放入它们,您也可以想要的任何方式取出它们。因此,发送方可以在一次调用中写入一个 1k block ,如果需要,您可以一次接收一个字节。

  2. 有很多方法,但这里有两个相当简单的方法:

    • 如果发送方在发送完所有数据后关闭套接字,接收方将收到所有发送的数据,下一次调用 recv 将返回 0,表示没有更多数据可接收。这就是 HTTP/1.0 的工作原理。
    • 您可以更改您的协议(protocol)以发送某种包含您将要发送的数据长度的 header ,然后 recv 将知道预期有多少字节。对于 Content-length header ,这就是 HTTP/1.1 的工作方式(好吧,在大多数情况下)。
  3. 您可以使用 select 来告诉您那里是否有任何东西,尽管它不会告诉您有多少。见问题 2。

关于c++ - 关于发送/接收的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1752589/

相关文章:

c++ - 使用 {0} 初始化结构

android - 我们应该为我们的移动多人游戏提供专用服务器吗?

c - 在linux中,我的系统的ip地址存在于哪个文件中

python - Kivy-如何从服务器持续接收数据并使用kivy更新界面

c++ - 多连接客户端套接字应用程序C++

sockets - PHP 套接字 - socket_sendto() - UDP header 不匹配

C++ 设计事件处理程序类

android - well_known_types_embed.cc -/bin/sh : js_embed: command not found

java - 无法使用Java DatagramSocket捕获UDP广播包

C++函数类型模板参数推导规则