2017-02-15 58 views
1

我的代码工作不错,但如果在工作过程中的任何错误都提高脚本将崩溃,不接收来自插座端口的任何其他请求,直到我手动重新运行它...重新连接到插座后crashe

#!/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后崩溃或关闭程序与控制+ c我不能重新运行它约4-5分钟由于socket in use错误!

回答

1

之后的任何插座意外抛锚

操作系统保持现状活着避免任何数据丢失

所以你必须尽快告诉操作系统释放口试试重新连接

.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 
2

喜欢的东西

while True: 
    try: 
     # open socket and do your stuff 
    except Exception as e: 
     # log 
     # close socket 
     # maybe sleep a couple of seconds