socket.error: [Errno 98] Address already in use的解决方法

目录

一:网络编程地址复用问题

二、解决方案

1.使用命令lsof -i:端口号 查找端口并使用kill结束进程

 2.允许地址重复用设置 

一:网络编程地址复用问题

最近在腾讯云的轻量级服务器上编写基于python的TCP服务器端程序并调试连接广和通的4G通信模组,但是在结束程序时会出现以下的报错:

socket.error: [Errno 98] Address already in use的解决方法_第1张图片

这个错误是因为在同一个端口上已经有一个进程在监听了。这个问题一般等待几分钟等释放端口重新运行程序也可以解决,但是这样不利于调试,这时我们可以进行以下两种处理方式。

二、解决方案

1.使用命令lsof -i:端口号 查找端口并使用kill结束进程

第一种处理方式是使用命令lsof -i:端口号查找端口并使用kill结束进程。这个命令可以查找到占用指定端口的进程ID,然后使用kill命令结束该进程即可。例如,如果我们想结束占用8080端口的进程,可以使用以下命令:

lsof -i:8080

这个命令会返回一个进程ID:26155socket.error: [Errno 98] Address already in use的解决方法_第2张图片

然后使用以下命令结束该进程:

kill 26155

 2.允许地址重复用设置

有可能使用lsof -i:命令查找不到进程的ID,这时可以手动添加代码,在Python代码中使用setsockopt()函数让Socket允许地址复用。在绑定之前,我们需要调用setsockopt()函数设置SO_REUSEADDR选项,这样就可以实现地址复用。可以使用以下代码实现:

#python
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)    #地址重复用
s.bind(('localhost', 8080))
s.listen(5)

 这段代码首先创建了一个Socket对象,然后调用setsockopt()函数设置SO_REUSEADDR选项为1,表示允许地址复用。最后绑定了localhost的8080端口。

#C
#include 
#include 
#include 

int MySocket = socket(AF_INET, SOCK_STREAM, 0);

int opt = 1;
setsockopt(MySocket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));    # 地址复用

struct sockaddr_in TCPADDR;
TCPADDR.sin_family = AF_INET;
TCPADDR.sin_addr.s_addr = inet_addr("127.0.0.1");
TCPADDR.sin_port = htons(8080);

bind(MySocket, (struct sockaddr *)&TCPADDR, sizeof(TCPADDR));
listen(MySocket, 5);

代码中我们首先创建一个socket对象,使用AF_INET和SOCK_STREAM参数指定了IPV4和TCP协议。然后调用setsockopt()函数设置SO_REUSEADDR选项为1,表示允许地址复用。接下来,我们创建了一个sockaddr_in结构体,指定了IP地址和端口号。最后,我们调用bind()函数绑定IP地址和端口号,并调用listen()函数开始监听。

你可能感兴趣的:(服务器,运维,python,tcp/ip)