我有几个有关.NET套接字实现的观点,因此我将顺序陈述:
- 我的理解是,插座的实例在其内部类实现中具有可变大小的缓冲区,实际上是字节的队列,并且与您在应用程序中声明和定义的应用程序缓冲区不同。
- 在同步模式下使用套接字类型:
stream
和协议类型:tcp
,当使用方法Receive
(正在阻止过程)时,使用参数应用程序字节缓冲区实际上是在具有相同大小相同大小的插座缓冲区脱水您在应用程序中声明和定义的应用程序字节缓冲区,然后将此块分配给您已发送到Receive
函数的应用程序字节缓冲区。 - 如果以上是正确的,那么当字节缓冲区长度大于插座队列中的字节元素时会发生什么?
- 另外,如果2是正确的,则插座的
Send
方法将数据发送到连接的主机套接字缓冲区而不是应用程序缓冲区。 - 最后,由于套接字方法
Accept
是非阻滞,因此在基础实现中为其创建了一个线程,并且它具有其自身队列,当Accept
方法被称为时。
。
我要求所有这些检查我到目前为止的理解是否正确,或者主要是错误的并且需要纠正。
首先,.NET的实现主要只是Winsock周围的托管包装。
我的理解是,插座的实例在其内部类实现中具有可变大小的缓冲区,实际上是字节的队列,并且与您在应用程序中声明和定义的应用程序缓冲区不同。
好吧。
在同步模式下使用套接字类型:...使用方法接收
当您致电接收时,数据将被复制到提供的缓冲区中,并将返回书面字节的数量。这可能小于缓冲区的大小。如果您的缓冲区不足以容纳TCP堆栈排队的所有数据,那么将复制到缓冲区中的多数字节将被复制,则将在您的下一个呼叫接收中返回其余字节。
插座将发送(或接收)的所有数据视为无断裂的连续流。但是,整个网络发送的数据受网络的约束或主机将数据拆分以满足最大数据包大小的约束。您的代码应假定数据可能以任意尺寸的块到达。顺便说一句,这种信息更可能出现在生产环境中,而不是在开发/测试中。
套接字将数据发送到连接的主机套接字缓冲区而不是应用程序缓冲区
当数据由TCP堆栈排队时,发送将返回。如果TCP窗口已满,并且远程端点没有读取套接字(例如,因为它正在等待自己的发送以完成),这可能是很长的时间。
最后,由于插座方法接受是非阻滞
根据文档,接受要么会阻止直到接收到连接,要么(在非阻止模式下)同步接受第一个可用连接,或者如果没有可用的连接。
这仍然是相关的,对于要开始编写网络代码的任何人,仍然建议阅读。