python - 错误号 98 : Address already in use - Python Socket

标签 python sockets tcp

以前有人问过这个问题,但没有一个答案对我有帮助。问题看起来很简单。我在树莓派上运行一个 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/

相关文章:

python - 使用 Python 的 LDA - 输入文件

python - 使用cherrypy进行HTTP和HTTPS

python - 如何在 Python 中打印指定列宽的列表?

sockets - 连接到防火墙后数据流量较低的设备

java - 在同一个Socket连接中发送多个HL7消息

c - 使用套接字下载(获取)文件时观察不稳定的行为

linux - 我如何在 Perl 中接受多个 TCP 连接?

python - Django url 不匹配,尽管它应该匹配

linux - 从源代码自定义编译 Apache Server

c++ - 套接字重连失败