.Net套接字类需要澄清

时间:2012-10-20 00:26:00

标签: c# .net sockets tcp stream

关于.NET套接字实现,我有几个要点,所以我将按顺序说明它们:

  1. 我的理解是Socket的一个实例在其内部类实现中有一个可更改大小的缓冲区,实际上是一个字节队列,也不同于您在应用程序中声明和定义的应用程序缓冲区。
  2. 在同步模式下使用套接字类型:stream和协议类型:tcp,当使用方法Receive(阻塞进程)时,使用参数应用程序字节缓冲区实际上是将套接字缓冲区以与您在应用程序中声明和定义的应用程序字节缓冲区大小相同的块中出列,然后将此块分配给发送到Receive函数的应用程序字节缓冲区。
  3. 如果上述情况属实,那么当字节缓冲区的长度大于套接字队列中的字节元素时会发生什么?
  4. 另外,如果2是正确的,那么套接字的Send方法将数据发送到端点连接的主机套接字缓冲区而不是应用程序缓冲区。
  5. 最后,由于Socket方法Accept是非阻塞的,因此在底层实现中为它创建了一个线程,它有一个自己的队列,当调用Accept方法时它会出列
  6. 我要求所有这些检查我的理解到目前为止是否正确,或者是否大多数错误并需要纠正。

1 个答案:

答案 0 :(得分:1)

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

  

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

好到目前为止。

  

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

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

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

  

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

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

  

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

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

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