c ++ Winsock发送,recv-他们的工作方式

时间:2014-08-07 11:29:41

标签: c++ sockets tcp

我是网络编程的新手,我正在尝试理解发送和recv等功能如何在TCP连接下工作。我知道在客户端和服务器之间的连接中,例如,当客户端管理向服务器发送消息,消息被拆分在不同的包中,当它到达时,服务器部分检查包的总和是否与发送前相同,如果没有则发送消息作为批准返回客户端。如果出现问题,客户端将重新发送该消息。

我不明白的是,如果您从客户端发送消息并在服务器上睡10秒钟,您仍然可以在客户端执行您想要的操作,例如发送功能正在另一个线程中执行,或者如果您在这10秒内使用多次发送功能,则该消息将作为该时间内使用的消息的组合到达。

如果有人能解释这种情况,我将非常感激!

1 个答案:

答案 0 :(得分:3)

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

TCP / IP堆栈......

  • 提供发送缓冲区。程序发送时,操作系统首先填充内部缓冲区。您的应用程序可以立即发送,直到缓冲区已满。然后你的发送将阻止。
  • 从内部缓冲区获取数据,并以单个数据包的形式将其发送到网络上。
  • 通过网络接收数据,并使用该数据填充内部接收缓冲区。
  • 在您致电接收时为您的程序提供内部缓冲区中的数据。
  • 负责TCP / IP协议,例如建立连接,确认收到的数据,如果没有收到接收确认,则重新发送数据。

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