我的代码运行良好,但如果在工作过程中出现任何错误,所有脚本都将崩溃,并且不会从套接字端口接收任何其他请求,直到我手动重新运行它……
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
import sys
import threading
import glob
import requests
HOST = 'xxx.xxx.xxx.xxx'
PORT = 5050
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print ('Socket created')
try:
s.bind((HOST, PORT))
except socket.error as mssg:
print ('Bind failed. Error Code : ' + str(mssg[0]) + ' Message ' + mssg[1])
sys.exit()
print ('Socket bind complete')
s.listen(10)
print ('Socket now listening')
def clientthread(conn,addrr):
while True:
data = conn.recv(1024)
rcv_data = data.decode("utf-8").strip()
if(len(rcv_data) != 0):
print(data)
reply =b"111\n\r"
r = requests.post("http://domain.comw.php?action=u&d="+rcv_data, data = {'act': rcv_data})
conn.send(reply)
else:
print('errr')
break
while True:
conn, addr = s.accept()
print ('Connected with ' + addr[0] + ':' + str(addr[1]))
t = threading.Thread(target=clientthread ,args=(conn,addr,))
t.daemon=True
t.start()
s.close()出现意外错误后,如何自动重新绑定套接字?!
还有其他愚蠢的事情是在linux崩溃或关闭control+c程序后,由于socket in use错误,我无法重新运行它大约4-5分钟!
发布于 2017-05-26 22:09:43
在任何套接字意外中断后
操作系统将状态保持为活动状态以避免任何数据丢失
所以你必须告诉操作系统尽快释放端口,以便尝试重新连接
.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)发布于 2017-02-15 15:35:54
就像这样
while True:
try:
# open socket and do your stuff
except Exception as e:
# log
# close socket
# maybe sleep a couple of secondshttps://stackoverflow.com/questions/42242265
复制相似问题