Python [Errno 98] แอดเดรสถูกใช้งานแล้ว


96

ในโปรแกรม Python socket ของฉันบางครั้งฉันต้องขัดจังหวะด้วยCtrl-C. เมื่อฉันทำสิ่งนี้จะปิดการเชื่อมต่อโดยใช้socket.close().

อย่างไรก็ตามเมื่อฉันพยายามเปิดขึ้นมาใหม่ฉันต้องรอสักครู่ก่อนที่จะเชื่อมต่อได้อีกครั้ง วิธีการปิดซ็อกเก็ตอย่างถูกต้อง? หรือนี่ตั้งใจ?

คำตอบ:


120

ใช่มันมีจุดมุ่งหมาย คุณสามารถอ่านคำอธิบายโดยละเอียดได้ที่นี่ เป็นไปได้ที่จะลบล้างพฤติกรรมนี้โดยการตั้งค่าอ็อพชัน SO_REUSEADDR บนซ็อกเก็ต ตัวอย่างเช่น:

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

แปลก. ฉันได้เรียกสิ่งนี้ก่อนที่จะผูกมัดและข้อผิดพลาดยังคงเกิดขึ้น ฉันต้องทำผิดที่อื่น
byxor

ไม่เป็นไรฉันมีสภาพการแข่งขันที่แปลกประหลาดเมื่อมีการเชื่อมโยงซ้ำ ๆ และปิดเธรดแยกต่างหากสำหรับการทดสอบอัตโนมัติของฉัน
byxor

คุณต้องนำเข้าโมดูลที่เรียกว่าซ็อกเก็ต
Bartosz

32
$ ps -fA | grep python
501 81211 12368   0  10:11PM ttys000    0:03.12  
python -m SimpleHTTPServer

$ kill 81211

2
น่าเสียดายที่มันไม่ได้ผลเสมอไป นี่เป็นความคิดทันทีของฉันเมื่อฉันพบปัญหานี้ แต่ไม่มีกระบวนการ python ที่จะฆ่าในกรณีของฉัน
Kryten

22

หากคุณใช้ TCPServer, UDPServer หรือคลาสย่อยในโมดูล SocketServer คุณสามารถตั้งค่าตัวแปรคลาสนี้ (ก่อนที่จะสร้างเซิร์ฟเวอร์):

SocketServer.TCPServer.allow_reuse_address = True

(ผ่านSocketServer.ThreadingTCPServer - ไม่สามารถผูกกับที่อยู่หลังจากรีสตาร์ทโปรแกรม )

สิ่งนี้ทำให้init (ตัวสร้าง) เป็น:

 if self.allow_reuse_address:
     self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

14

เนื่องจากคุณพยายามเรียกใช้บริการในพอร์ตเดียวกันกับที่รันอยู่

บางครั้งก็เกิดขึ้นเนื่องจากบริการของคุณไม่ได้หยุดอยู่ในกองกระบวนการ คุณต้องฆ่าพวกมัน

ไม่จำเป็นต้องติดตั้งอะไรที่นี่เป็นคำสั่งบรรทัดเดียวเพื่อฆ่ากระบวนการ python ที่รันอยู่ทั้งหมด

สำหรับระบบปฏิบัติการที่ใช้ Linux:

ทุบตี:

kill -9 $(ps -A | grep python | awk '{print $1}')

ปลา:

kill -9 (ps -A | grep python | awk '{print $1}')

1
ทำงานให้ฉันขอบคุณ!
รหัส

1
ทำงานให้ฉันขอบคุณ
user007


7

ไม่มีอะไรได้ผลสำหรับฉันยกเว้นการรันกระบวนการย่อยด้วยคำสั่งนี้ก่อนที่จะเรียกHTTPServer(('', 443), myHandler):

kill -9 $(lsof -ti tcp:443)

แน่นอนว่านี่เป็นเพียงระบบปฏิบัติการที่เหมือน linux เท่านั้น!


4

ก่อนอื่นให้ค้นหารหัสกระบวนการ python โดยใช้คำสั่งนี้

ps -fA | grep python

คุณจะได้รับหมายเลข pid จากการตั้งชื่อกระบวนการ python ของคุณในคอลัมน์ที่สอง

จากนั้นฆ่ากระบวนการโดยใช้คำสั่งนี้

kill -9 pid

0

มีข้อผิดพลาดเดียวกัน:
ทำตามขั้นตอน:
1 - ใช้$ ps -fA | grep python
2 - ฆ่ากระบวนการทั้งหมด
3 - ปิดเทอร์มินัล
4 - เปิดใหม่และเปิดแอปพลิเคชัน (mkchromecast)
5 - ไม่ได้รับข้อความแสดงข้อผิดพลาดนี้

มีปัญหาอื่น ติดตามต่อไป


0

รันคำสั่ง

fuser -k (port_number_you_are _trying_to_access)/TCP

ตัวอย่างสำหรับขวด: fuser -k 5000/tcp

นอกจากนี้โปรดจำไว้ว่าข้อผิดพลาดนี้เกิดขึ้นเมื่อคุณเชื่อมต่อโดย ctrl + z เพื่อยุติการใช้ ctrl + c

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.