对于.NET Socket连接的细节记录

如果客户端直接连接一个不存在的服务器端,客户端会抛出异常:

image

如果在连接过程中,客户端强制关闭了连接(没有调用Close直接关闭了程序),服务器端会抛出异常:

image

如果在连接过程中,客户端调用了Close,服务器会抛出异常:

image

如果客户端继续调用已经Close的Socket连接,则会得到异常:

image

关于Send方法:同步调用Socket的过程中,Socket.Send方法在缓冲区没有满之前是不会阻塞的,可以用服务器端不停得发数据,客户端不调用Receive,即可很快看到这个效果。但是缓冲区满了以后,Send方法就会阻塞直到客户端使用Receive方法读取掉一些数值以后才可以继续调用。

关于Receive方法:如果当前连接没有被关闭,并且缓冲区中有数据,则会尽可能多得读出,读出数据是缓冲区内容长度和Receive方法传入数组长度的最小值。也就是说,可能会一次读出两次传输的内容,也可能读不完一次传输的内容,需要在业务层面做很多的长度保证工作以及内容解析工作。如果缓冲区已经读完,就会block,如果这是服务器关闭了连接,客户端就会不停收到长度是0的结果,需要对这个情况作特殊处理。

原文地址:https://www.cnblogs.com/vanpan/p/3637679.html