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

时间:2017-08-19 05:11:09

标签: python sockets

我有这段代码:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scroll_view"
android:layout_width="match_parent"
android:fillViewport="true"
android:layout_height="match_parent">

   <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/text1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/text2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/text3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <chatapp.com.testdemo.CustomPager
        android:id="@+id/custom_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

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

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()

我找到的唯一解决方案是使用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)。我

我使用的是Windows 10,Python 2.7.13。

1 个答案:

答案 0 :(得分:2)

我可以通过同时运行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