网络编程学习

一 阻塞式服务器并发编程中 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的非阻塞并发编程。

posted on 2022-04-16 15:55  杰瑞鼠  阅读(33)  评论(0编辑  收藏  举报