Weird Errno 48 Адрес уже используется, поведение python

В настоящее время я пытаюсь понять сокеты в Python и использую следующий код для получения данных, передаваемых через TCP со смартфона в сети Hotspot.

import socket
import logging

# Logging routine
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Bind the socket to the port
server_address = ('localhost', 5000)
logger.info('starting up on %s port %s' % server_address)
sock.bind(server_address)

# Listen for incoming connections
sock.listen(1)

# Wait for a connection
logger.info('waiting for a connection')
connection, client_address = sock.accept()

try:
    logger.info('connection from', client_address)

    while True:
        data = connection.recv(16)

        if data:
            print 'Do stuff here'
        else:
            print 'no more data from', client_address
            break

finally:
    # Clean up the connection
    connection.close()

При первом запуске кода все работает правильно. После запуска скрипта и повторного запуска у меня возникает следующая ошибка: [Errno 48] Address already in use?. Однако, если я снова запускаю скрипт после сбоя программы, все работает правильно. Я проверил и подтвердил, что он заканчивается оператором finally для connection.close(). Кажется, мне всегда нужно запускать программу два раза, чтобы иметь возможность запускать ее два раза подряд.


person dudas    schedule 05.11.2015    source источник
comment
После каждого запуска выполняйте эту команду в командной строке: netstat -an | egrep :5000. Дайте нам знать, что он говорит.   -  person Robᵩ    schedule 05.11.2015
comment
@Rob Предоставленная команда не производит вывод.   -  person dudas    schedule 05.11.2015
comment
Моя просьба заключалась в том, чтобы запускать эту команду после каждого запуска. Тест, который вы описываете, запускает вашу команду три раза. После какого из трех описанных вами запусков команда не дала никаких результатов?   -  person Robᵩ    schedule 05.11.2015


Ответы (1)


Это связано с тем, что предыдущее выполнение оставило сокет в состоянии TIME_WAIT и не может быть немедленно повторно использовано.

чтобы этого не допустить, установите socket.SO_REUSEADDR:

сдача

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

to

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR, 1)
person Fujiao Liu    schedule 05.11.2015
comment
Спасибо за ваш ответ. Но, к сожалению, тоже не работал. Я запускаю скрипт один раз. Со второго раза получаю ошибку. Если я снова запускаю, он работает без проблем. Это не решило. - person dudas; 05.11.2015
comment
в чем ошибка? это socket.error: [Errno 98] Address already in use ? - person Fujiao Liu; 05.11.2015
comment
Отрицательно, та же самая ошибка: [Errno 48] Address already in use - person dudas; 05.11.2015
comment
поскольку вы запускали скрипт раньше, скорее всего, этот процесс все еще привязан к порту (5000). Я думаю, вам нужно убить привязку процесса к порту, а затем повторно запустить скрипт. проверьте это, stackoverflow .com/questions/19071512/ - person Fujiao Liu; 05.11.2015
comment
Хм, хорошо, это имеет смысл. Есть ли возможность сделать это программно в конце скрипта? - person dudas; 05.11.2015
comment
он подключен, я запускаю код на ubuntu, и он работает. . - person Fujiao Liu; 05.11.2015
comment
@ Я работаю на Mac. Я могу попробовать Ubuntu, но я бы предпочел запустить это на Mac. Странная мысль о проблеме. - person dudas; 05.11.2015
comment
Давайте продолжим это обсуждение в чате. - person Fujiao Liu; 06.11.2015