socket.close()执行之后 之前用的那个端口会自己释放掉吗 是马上释放还是过断时间自己释放?还有个问题udp传数据报的时候每个packet有大小限制的  那tcp 字节流方式传送的 应该没有的吧?  

解决方案 »

  1.   

    1. 执行之后会释放端口,但可能不是立即释放,如果此时仍有连接是打开的,那么会等待一段时间,确保网络上寻址到此端口的数据(它们还可能正在网络上传输),以避免这些数据流窜到绑定于相同端口的程序。接受到这些数据后,系统只是简单的将他们呢抛弃。
       有两个SO_OPTION会影响socket.close()的行为,如果设置SO_LINGER为大于0的值,那么socket.close()不会立即返回,而是等当前buff的数据全部发生完毕或超时才会返回。
       如果过设置SO_REUSEADDR,那么socket.close()之后,即使端口没有释放,也可以允许其他程序立即bind到此端口。2. 由于UDP的每个数据包可能来自于不同的地方,所以UDP每次receive总是一个完整的数据包,UDP的报文大小最大为65507;而TCP的数据被看作一个连续不断的字节流,所以不会有大小限制,但是设置合适的SO_RCVBUF和SO_SNDBUF到时会对性能有所影响。