关闭并重新打开 Python 套接字后,“[Errno 10048] 通常只允许每个套接字地址(协议/网络地址/端口)使用一次”

2023-11-22

我有这个代码:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    s.bind(('10.0.0.253', 8080))
except:
    s.close()
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('10.0.0.253', 8080))


s.listen(1)
conn, addr = s.accept()

它绑定,然后如果遇到错误,则会销毁套接字,然后创建一个新套接字并将其绑定到相同的 IP 和端口。由于某种原因,即使关闭套接字后,我也会收到此错误:

Traceback (most recent call last):
File "C:\Users\other\Desktop\tcpReverseShell_Server.py", line 68, in <module>
  main()
  File "C:\Users\other\Desktop\tcpReverseShell_Server.py", line 66, in main
  connect()
File "C:\Users\other\Desktop\tcpReverseShell_Server.py", line 43, in connect
  s.bind(('10.0.0.253', 8080))
File "C:\Python27\lib\socket.py", line 228, in meth
  return getattr(self._sock,name)(*args)
error: [Errno 10048] Only one usage of each socket address (protocol/network 
address/port) is normally permitted

我发现的唯一解决方案是使用s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1),但是当我尝试时,我收到此错误:[Errno 10013] An attempt was made to access a socket in a way forbidden by its access permissions. I

我使用的是 Windows 10,Python 2.7.13。


我可以通过同时运行 python 脚本两次来模拟你的问题。问题是其他一些应用程序当前也在使用该套接字。

在您的代码中,当套接字绑定失败时,将触发 except 块。然而,当你尝试.close()套接字并重试,它什么也没做,因为它正在尝试.close()未绑定的套接字。因此,您的代码相当于:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('10.0.0.253', 8080))

s.listen(1)
conn, addr = s.accept()

请注意,当您.close()插座,它也没有.close()当前绑定的应用程序,它尝试.close()到您创建的套接字对象。因此,尝试再次绑定套接字将会失败。

要找出正在使用套接字的内容,您可以使用netstat:

netstat -aon | findstr :8080

这应该给你类似的东西:

TCP    127.0.0.1:8080         0.0.0.0:0              LISTENING       6604

然后,如果你想强行杀死它,你可以使用TaskKill以及应用程序的 PID:

TaskKill /PID 6604 /F
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关闭并重新打开 Python 套接字后,“[Errno 10048] 通常只允许每个套接字地址(协议/网络地址/端口)使用一次” 的相关文章

随机推荐