Errno 98:地址已在使用 - Python Socket

时间:2016-05-22 23:47:33

标签: python sockets tcp

此问题之前已被提出,但没有一个答案对我的案例有帮助。问题似乎很简单。我在覆盆子pi上运行TCP服务器并尝试从另一台机器连接到它。我有一个自定义类接收器,用于将传感器数据传输到此脚本。

当我关闭在另一台机器上运行的程序时(插座是'关机(2)' d然后'关闭()' d),我无法重新连接到那个港口了。我试图在两个插座(1180和1181)之间交替,但这不起作用。当我通过端口连接一次时,它将永远消失,直到我重新启动TCP服务器。我尝试重新启动脚本(使用executl()),但这并没有解决我的问题。我告诉套接字它应该重用地址但无济于事。

我能做的是使用更多的端口,但这需要在RPi上打开更多端口,我想避免(必须有另一种解决方法)。

import socket
from receiver import receiver
import pickle
import time
import os
import sys

TCP_IP = ''
TCP_PORT = 1180
BUFFER_SIZE = 1024

print 'Script started'

while(1):
    try:
            print 'While begin'
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            print 'Socket created'
            s.settimeout(5)
            print 'Trying to bind'
            s.bind((TCP_IP, TCP_PORT))
            print 'bound to', (TCP_IP, TCP_PORT)
            s.listen(1)
            print 'listening for connection'

            conn, addr = s.accept()
            print 'accepted incoming connection'
            s.settimeout(5)
            r = receiver()
            print 'Connection address:', addr
            for cur in r:
                 #print "sending data:", cur
                 print len(cur.tostring())
                 conn.send(cur.tostring())  # echo
    except Exception as e:
            r.running = False
            print e
            if TCP_PORT == 1181:
                    TCP_PORT = 1180
            else:
                    TCP_PORT = 1181
            time.sleep(1)
            print 'sleeping 1sec'

1 个答案:

答案 0 :(得分:3)

您的服务器套接字仍在使用中,因此您无法为每个端口打开多个服务器套接字。但为什么要这样呢。只需为所有连接重复使用相同的套接字(即服务器套接字的用途):

import socket
from receiver import receiver
import logging

TCP_IP = ''
TCP_PORT = 1180
BUFFER_SIZE = 1024

print 'Script started'
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created'
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
print 'Trying to bind'
server.bind((TCP_IP, TCP_PORT))
print 'bound to', (TCP_IP, TCP_PORT)
server.listen(1)
print 'listening for connection'

while True:
    try:
        conn, addr = server.accept()
        print 'accepted incoming connection'
        print 'Connection address:', addr
        for cur in receiver():
            data = cur.tostring()
            #print "sending data:", cur
            print len(data)
            conn.sendall(data)  # echo
    except Exception:
        logging.exception("processing request")
相关问题