龙空技术网

linux 如何close 指定的socket的几种方法

臻细入微 140

前言:

而今小伙伴们对“关闭socket函数”可能比较关切,你们都想要知道一些“关闭socket函数”的相关知识。那么小编也在网络上搜集了一些有关“关闭socket函数””的相关文章,希望姐妹们能喜欢,朋友们快快来学习一下吧!

经常做服务端开发、或者客户端开发的你虽然很多时候都是没有什么问题,但是俗话说的好,常在河边站哪有不湿鞋,你总会遇到生产环境上有些异常的socket 需要把它关闭。至于为什么,比如发现这条链路经常发送一些异常的请求包、或者是一些Hungup的socket(FIN包没有收到,本机客户端没有开启tcp_keepalive 业务层也没有心跳机制)尤其是在某些虚拟化场景下,没有心跳机制或者是心跳的周期比宿主机session timeout时间还长,导致宿主机回收了session此时宿主机是不会给服务端、客户端发送reset包)。那么我们想关闭指定的socket的时候我们应该如何操作呢?

方案1:暴力型(万能的重启)

直接重启服务,如果重启服务对你的业务没有影响,那自然是直接重启服务就可以了。

方案2:用tcpkill

需要安装dnsiff(centos:yum install dsniff --enablerepo=epel)调整iptable :

iptables -A INPUT -s IP-ADDRESS -j DROP

在规则链表后面追加一个针对源ip 是IP-ADDRESS的 入包 执行丢弃操作

注意将IP-ADDRESS 替换成你需要kill的socket IP

3. 使用命令tcpkill -I eth0 -9 port xxxx

将xxx 换成对应的socket 连接端口,eth0 换成你服务对应的网卡

方案3: 使用ss --kill(-K)

如果你的lkerne>=4.9 那么可是用该方法来kill 对应的socket

eg: ss -K dst 192.168.2.214 dport=40290

方案4:使用gdb

1.首先通过ss -anp 获取到你想要kill 的socket对应的fd(或者使用lsof 来获取),这里假定对应的fd是1024

2. gdb attach 到对应进程,然后在里面执行以下命令即可:

call close(1024)

quit

抛砖引玉,如果大家有更好的方法,欢迎留言

标签: #关闭socket函数