以下都是讨论 TCP 连接第一个疑问: 建立好 Socket 后服务端进入 Accept 状态,当客户端发起一个连接后,如果此时客户端没有 Send 数据,服务端如何知道什么时候应该 Receive 数据呢? 第二个疑问: 如果客户端不停的向服务端 Send 数据,但是服务端不 Receive,会发生什么情况,那些发送来数据会存放在哪里?还是会被丢弃?

解决方案 »

  1.   

    第一个疑问: 建立好 Socket 后服务端进入 Accept 状态,当客户端发起一个连接后,如果此时客户端没有 Send 数据,服务端如何知道什么时候应该 Receive 数据呢? 第1个方法while(true) 一直在获取数据
    第2个方法 异步来接收, 使用异步更简单一些第二个疑问: 如果客户端不停的向服务端 Send 数据,但是服务端不 Receive,会发生什么情况,那些发送来数据会存放在哪里?还是会被丢弃?
    最终还是都回丢弃的.
      

  2.   

    1、如果没有send,则服务器端处于等待状态,socket会挂起
    2、多次发送数据如果服务器不接收,下次就会发送失败
      

  3.   

    还想再问一个问题,如果 Receive 的数据中不含有 "\n",而且接收到的数据还没有达到 Byte 缓冲区设置的大小是不是就一直处于阻塞状态而在等待新的数据呢? 
      

  4.   

    NetworkStream.Read() 为什么不会阻塞呢?它不是封装了 Socket.Receive 吗?
      

  5.   

    http://www.wangchao.net.cn/bbsdetail_1774557.html
    在接下来的两个域中,序列号和确认号是TCP实现可靠连接的要害。当建立一个TCP连接时,发送方主机发出一个随机的初始化序列号给初始化器,初始化器将其加1后送回确认域的起始器,这意味着下一个字节可以发送了。一旦数据开始流动,序列号和确认号将跟踪已发送了那些数据,那些数据已被确认。因为每个域都是32位,总共可以有232个值,所以每个域的范围是:0~4294967295,当超过上限时回到0。  TCP的传输机构有多个定时器。当一个包发送时,重发定时器开始计数;当收到确认信号后,重发定时器停止计数。假如超过设定时间段还没有收到确认信号,就重发该包。一个比较棘手的问题是如何设置该时间段。假如太长,当网络传输错误增加时将导致不必要的等待时间;假如太短,就会产生过多的重复包从而降低网络的反应时间。现代TCP协议根据实际情况对重发定时器进行动态设定。 不管重发过程执行得多么有效,很少的丢失包就能严重地降低TCP连接的流量。每个未收到的包或包的片段只会在重发定时器超时的时候才会丢失。在数据重发时,接收过程一直在递送这些重发的数据,这样就使总体的数据传输陷于停顿,直到丢失的数据被取代为止。这些重发过程导致基于TCP的连接有时处于不稳定状态。 
      

  6.   

    第二个疑问: 如果客户端不停的向服务端 Send 数据,但是服务端不 Receive,会发生什么情况,那些发送来数据会存放在哪里?还是会被丢弃?一开始会造成堵塞,数据还是存在的,接受和发送都有一个超时时间,在这个超时时间内接收数据是不会丢失的,之后数据就丢失了。
      

  7.   

    还想再问一个问题,如果 Receive 的数据中不含有 "\n",而且接收到的数据还没有达到 Byte 缓冲区设置的大小是不是就一直处于阻塞状态而在等待新的数据呢? 没,缓冲区设置的只是最大字节数,小于这个缓冲数据接收完毕就会进行处理了,当然你需要将下次接收的数据和这次接收的数据进行拼接,比如说:你需要传输的数据是:你好啊\n, 而第一次接收的是“你好”,下次就需要把 “啊\n”拼接上去处理,这有许多方法,这里就不多说了。