网络编程学习
一 阻塞式服务器并发编程中 socket关闭之close()和shutdown()的差异 fork()模式:
close()是对于文件操作,关闭读写,shutdown()是对socket来说(对TCP可关闭读,关闭写,或关闭读写),但linux下一切设备皆文件。前者只是将分配的socket_fd减1,并不是立即关闭(还能接收,等其自行接触阻塞执行完后才关闭,下次再操作才失败算关闭彻底发送FIN包(TCP栈的读缓冲里还有未读取(read)数据,则调用close时会直接向对端发送RST包)。只有减到0时才执行关闭);而后者则是立即激活阻塞等待的线程时期关闭。 shutdown与socket描述符没有关系,根据linux中任何皆为文件的特性,所以调用shutdown后还要调用close才能消除操作系统对这个socket的管理。
SO_LINGER 这个参数对应大量短链接的服务器很有必要!是否那个timwait
appl: close(), --> FIN FIN_WAIT_1 //主动关闭socket方,调用close关闭socket,发FIN
<-- ACK FIN_WAIT_2 //对方操作系统的TCP层,给ACK响应。然后给FIN
<-- FIN
--> ACK "TIME_WAIT" -- 2MSL timeout -->CLOSED
//TIME_WAIT,防止ACK没有给到对方。2MS时间长,所以服务器减少主动关闭连接。
二 非阻塞nonblocking socket和epoll的非阻塞并发编程。