以前有人问过这个问题,但没有一个答案对我有帮助。问题看起来很简单。我在树莓派上运行一个 TCP 服务器,并尝试从另一台机器连接到它。我有一个自定义类接收器,可将传感器数据通过管道传输到此脚本。
当我关闭在另一台机器上运行的程序时(套接字是'shutdown(2)'d,然后是'close()'d),我无法再重新连接到同一个端口。我尝试在两个 socket (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'
最佳答案
您的服务器套接字仍在使用中,因此您不能为每个端口打开一个以上的服务器套接字。但为什么要一个。只需为所有连接重用相同的套接字(这就是服务器套接字的用途):
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")
关于python - 错误号 98 : Address already in use - Python Socket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37380793/