【问题标题】:Clarifications required on .Net socket classes.Net 套接字类需要说明
【发布时间】:2012-10-10 15:38:01
【问题描述】:

关于 .NET 套接字实现我有几点意见,所以我将依次说明它们:

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

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

【问题讨论】:

  • #5 很难理解你在问什么。
  • 我在问我的理解是否有缺陷,或者我实际上与那些创建我用来了解 .net 套接字的参考资料的人处于同一页面。
  • 我不知道 .NET,但如果 (1) 是正确的,我会感到惊讶。套接字龙舌兰发送和接收缓冲区是可以的,但是在内核中,因此类中不需要另一个。
  • @EJP 我认为(不确定,因为我还是个新手)winsock API 函数调用被定向到正在运行的 Windows 网络服务。这方面还有很多东西要学。
  • 不,它们被定向到包含我提到的缓冲区的内核组件。

标签: c# .net sockets tcp stream


【解决方案1】:

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

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

到目前为止还可以。

在同步模式下使用socket类型:...当使用Receive方法时

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

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

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

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

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

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

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

【讨论】:

  • 感谢您的详尽回答,我无法投票,所以我会接受。
  • 缓冲区不在“内部类实现”中。它在内核中,有两个,发送和接收。
  • 我明白了,它们在所谓的 Winsock SPI 中吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多