【问题标题】:c++ Winsock send,recv -how they workc++ Winsock send,recv - 它们是如何工作的
【发布时间】:2014-08-07 11:29:40
【问题描述】:

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

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

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

【问题讨论】:

  • 仔细看完整的TCP/IP栈的实现,从上到下,看看能不能找到TCP/IP Illustrated series的副本,尤其是第2卷,它经历了实际的实现4.4BSD 的堆栈(据称微软最初基于他们的实现)。即使 4.4BSD 堆栈陈旧过时,它也可以让您对幕后发生的事情有相当多的了解。
  • 操作系统级别的 TCP 缓冲

标签: c++ sockets tcp


【解决方案1】:

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

TCP/IP 堆栈 ...

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

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

【讨论】:

    猜你喜欢
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    相关资源
    最近更新 更多