0

我对 .NET 套接字实现有几点看法,所以我将按顺序说明它们:

  1. 我的理解是,Socket 的实例在其内部类实现中具有可变大小的缓冲区,实际上是一个字节队列,并且与您在应用程序中声明和定义的应用程序缓冲区不同。
  2. stream在使用 socket type:和 protocol type:的同步模式下tcp,当使用方法Receive(阻塞进程)时,带有参数的应用程序字节缓冲区实际上是在与您声明的应用程序字节缓冲区大小相同的块中将套接字缓冲区出队并在您的应用程序中定义,然后将此块分配给您发送给Receive功能的应用程序字节缓冲区。
  3. 如果上述情况成立,那么当字节缓冲区的长度大于套接字队列中的字节元素时会发生什么?
  4. 此外,如果 2 正确,则Send套接字的方法将数据发送到端点连接的主机套接字缓冲区而不是应用程序缓冲区。
  5. 最后,由于 Socket 方法Accept是非阻塞的,因此在底层实现中为它创建了一个线程,并且它有一个自己的队列,当Accept方法被调用时它会出队。

我要求所有这些来检查我到目前为止的理解是否正确,或者它是否大部分是错误的并且需要纠正。

4

1 回答 1

1

首先.net 的实现主要是一个围绕winsock 的托管包装器。

我的理解是,Socket 的实例在其内部类实现中具有可变大小的缓冲区,实际上是一个字节队列,并且与您在应用程序中声明和定义的应用程序缓冲区不同。

到目前为止还好。

在使用套接字类型的同步模式下:...当使用 Receive 方法时

当您调用 Receive 时,数据将被复制到提供的缓冲区中,并返回写入的字节数。这很可能小于缓冲区的大小。如果您的缓冲区不够大,无法容纳 TCP 堆栈排队的所有数据,则只会复制可以复制到缓冲区中的尽可能多的字节,剩余的字节将在您下次调用 Receive 时返回。

套接字将所有发送(或接收)的数据视为不间断的连续流。但是,通过网络发送的数据受制于网络或主机拆分数据以满足最大数据包大小等限制。您的代码应该假设数据可能以任意大小的块到达。顺便说一句,这种消息更有可能出现在生产环境中而不是开发/测试环境中。

套接字将数据发送到端点连接的主机套接字缓冲区而不是应用程序缓冲区

当数据被 TCP 堆栈排队时,Send 将返回。如果 TCP 窗口已满并且远程端点没有读取套接字(例如,因为它正在等待自己的发送完成),这可能是很长时间。

最后,由于 Socket 方法 Accept 是非阻塞的

根据文档,Accept 将阻塞直到接收到连接,或者(在非阻塞模式下)同步接受第一个可用连接,或者如果没有可用连接则抛出。

仍然是相关的,仍然建议任何即将开始编写网络代码的人阅读。

于 2012-10-20T01:02:12.623 回答