导航:首页 > 操作系统 > closelinuxsocket

closelinuxsocket

发布时间:2025-03-11 00:14:35

‘壹’ linux python socket怎么去除

原因是server端关掉了tcp连接,给client发送FIN信号,client的tcp层回了ACK,然后它的socket状态就处于close_wait状态。

实验:

Python中,socket在send之前处于close_wait状态,那么该send不会报错,并且执行完之后socket就closed了。再继续调用send就会报错。


推理:

说明python的socket.send在发送数据之前会检查socket的状态,如果处于close_wait,就执行close(socket)(应用层感觉不到哦),然后正常退出。所以再次send时,会抛出异常。


为什么会一直处close_wait状态?

当socket处于close_wait时,必须由应用层调用close(socket),发送FIN给server端才能变为LAST_ACK,接收到server端回应的ACK后,才变为CLOSED。如果应用层不调用close(),那么socket会一直处于close_wait。[1]


如果我在python中不断循环去调用socket.sendall(),那么在socket变为close_wait后,通过socket.sendall()也会关闭socket,为什么它还是一直处在close_wait状态呢?

原因在于当sendall(data)的data比较大,在data被发送一半时,连接被server端断掉了。那么sendall(data)会一直卡在那,也就不会执行到sendall的开始处,去判断socket状态,确定是否关闭socket了。

简单而言,就是socket在变为close_wait之后,根本没有调用sendall()去关闭socket。


‘贰’ linux socket 能bind两次吗我已经close了,但不能绑定第二次

必须不能,若要第二次绑定,必须将第一次的close,而系统释放这个socket资源是需要一段时间的所以bind之前执行
int tmp = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &tmp, sizeof(int));
目的是设置套接字属性为,当tmp非0的时候重用bind中的地址

阅读全文

与closelinuxsocket相关的资料

热点内容
安卓手机上的文件怎么拷贝到电脑 浏览:761
教你一个解压神器 浏览:399
压垮程序员的bug 浏览:347
cad成面命令 浏览:913
php文件内容清空 浏览:867
服务器管理为什么要云帮手 浏览:638
mac命令行粘贴 浏览:140
java17api中文下载 浏览:431
带spi的单片机 浏览:94
node项目编译桌面程序 浏览:319
163服务器没有响应什么意思 浏览:964
怎么看编译器是32位还是64位 浏览:665
程序员试题百度云 浏览:839
谈论不同的解压方法 浏览:572
如何透明加密 浏览:594
如何将电脑变成一台服务器 浏览:251
秒学汉字app怎么样 浏览:517
中兴r10路由器恢复出厂命令 浏览:1000
私密照放加密软件 浏览:688
手机外接硬盘文件夹 浏览:419