Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要对.Net套接字类进行澄清_C#_.net_Sockets_Tcp_Stream - Fatal编程技术网

C# 需要对.Net套接字类进行澄清

C# 需要对.Net套接字类进行澄清,c#,.net,sockets,tcp,stream,C#,.net,Sockets,Tcp,Stream,关于.NET套接字实现,我有几点看法,因此我将按顺序说明: 我的理解是,套接字实例在其内部类实现中有一个大小可变的缓冲区,实际上是一个字节队列,并且与您在应用程序中声明和定义的应用程序缓冲区不同 在同步模式下,使用套接字类型:stream和协议类型:tcp,当使用方法Receive(阻止进程)时,通过一个参数,application byte buffer实际上是将套接字缓冲区排在与您在应用程序中声明和定义的应用程序字节缓冲区大小相同的块中,然后将该块分配给您发送到Receive函数的应用程序字

关于.NET套接字实现,我有几点看法,因此我将按顺序说明:

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

  • 我要求所有这些来检查我目前的理解是否正确,或者是否大部分都是错误的,需要纠正。

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

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

    好的,到目前为止

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

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

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

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

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

    最后,由于套接字方法Accept是非阻塞的

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


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

    #5很难理解您的问题。我想问的是,我的理解是否有缺陷,或者我实际上与那些创建我用来了解.net套接字的引用的人在同一页。我不知道.net,但我会的如果(1)是正确的,则表示惊讶。套接字可以发送和接收缓冲区,但在内核中,因此类中不需要另一个。@EJP我想(因为我还是新手,所以不确定)winsock API函数调用是指向运行的windows网络服务的。关于这一点,还有很多需要了解。不,它们是指向包含我提到的缓冲区的内核组件的。感谢您给出的完整答案,我不能投票赞成,所以我接受它。缓冲区不在“内部类实现”中。它在内核中,有两个,发送和接收。我明白了,它们在所谓的Winsock SPI中吗?