C++ Winsock send,recv - 它们是如何工作的

标签 c++ sockets tcp

我是网络编程的新手,我正在尝试了解 send 和 recv 等函数在 TCP 连接中的工作原理。我知道在客户端和服务器之间的连接中,例如,当客户端设法向服务器发送一条消息,消息被分成不同的包,在它到达时,服务器部分检查包的总和是否与发送前相同,如果正常则发送一条消息作为批准返回给客户端。如果出现问题,客户端会重新发送消息。

我不明白的是,如果你从客户端发送一条消息,然后让服务器休眠 10 秒,你仍然可以在客户端做你想做的事,比如发送函数在另一个线程中执行,或者如果您在这 10 秒内多次使用发送功能,消息将作为当时使用的消息的组合到达。

如果有人能解释一下情况,我将不胜感激!

最佳答案

这是由操作系统的 TCP/IP 网络堆栈实现的。

TCP/IP 堆栈 ...

  • 提供一个发送缓冲区。当您的程序发送时,操作系统首先填充内部缓冲区。您的应用程序可以立即发送,直到缓冲区已满。然后您的发送将被阻止。
  • 从内部缓冲区获取数据并以单个数据包的形式将其发送到网络上。
  • 通过网络接收数据并用该数据填充内部接收缓冲区。
  • 在您调用 receive 时为您的程序提供来自内部缓冲区的数据。
  • 负责 TCP/IP 协议(protocol)的事务,例如建立连接、确认收到的数据、如果未收到接收确认则重新发送数据。

在您编写的情况下,客户端正在填充发送方操作系统的发送缓冲区和接收方操作系统的接收缓冲区。您的客户端可以发送非阻塞,直到两个缓冲区都已满。然后它将阻塞,直到服务器再次调用 recv。

关于C++ Winsock send,recv - 它们是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25181387/

相关文章:

C++ 钻石(多重)虚拟继承中的成员和 vtable 顺序

c - 为什么原始套接字改变了我的 TCP 校验和

scala - akka.io 在 2.3 中逐行接收

sockets - so_reuseaddr相关的问题

c++ - cv::Mat 到 QImage 的转换无法正常工作

c++ - 为什么这段代码的结果是 0?

c - recv(...) 是否以这种方式运行?

java - 通过 C++ 和 Java 之间的 TCP 套接字发送消息

c# - 保持事件状态并请求超时

c++ - glm 在简单翻译中返回 nan