📌  相关文章
📜  [Errno 98] 地址已在使用中 (1)

📅  最后修改于: 2023-12-03 14:38:56.671000             🧑  作者: Mango

介绍 '[Errno 98] 地址已在使用中' 错误

当一个程序尝试绑定一个端口或IP地址时,如果该端口或IP地址已被另一个程序占用,就会出现 '[Errno 98] 地址已在使用中' 错误。这通常是因为当前系统中已经有其它程序在使用相同的端口或IP地址。

常见场景

此错误常常发生在服务器应用程序中,比如HTTP服务、FTP服务、SMTP服务等。当一个服务器程序尝试监听并绑定一个端口,但该端口已被其它程序使用时,这个错误就会发生。

解决方案

解决 '[Errno 98] 地址已在使用中' 错误的方式有多种,以下是一些常用方法:

  • 停止占用端口或IP地址的程序:可以使用 lsofnetstat 等命令查找进程 PID,然后使用 kill -9 [PID] 来强制结束该进程。注意:强制结束进程时可能存在风险,请谨慎操作。

  • 修改待绑定的端口或IP地址:可以修改程序代码中要绑定的端口或IP地址,确保其不与已占用的端口或IP地址冲突。

  • 使用 SO_REUSEADDR 选项:可以让一个端口被多个进程使用,配置方法是在程序中指定 SO_REUSEADDR 选项,如下所示:

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(('localhost', 8888))
server.listen(5)

这里的 server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 就是设置 SO_REUSEADDR 选项,该选项的值为 1 表示要启用该特性。

总结

'[Errno 98] 地址已在使用中' 错误是一个常见的网络编程错误,通常由于端口或IP地址被其它程序占用而导致。我们可以使用 lsofnetstat 等命令查找占用该端口或IP地址的进程并结束它,或者在程序中指定 SO_REUSEADDR 选项来解决该问题。