Как я могу получить send () для блокировки с UDP? - PullRequest
1 голос
/ 21 ноября 2011

Я пишу простое клиент-серверное приложение на основе UDP и тестирую клиент-сервер на локальном хосте, и я хотел бы, чтобы отправитель знал, когда send () заблокировался бы.Я использую Python, поэтому я думаю, что могу сделать:

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setblocking(0)
s.connect(('127.0.0.1', 12345))
data = "x"
for i in range(0, 9000):  # More than about 9000 gives an error
    data += x
while True:
    try:
        s.send(data)
    except socket.error as e:
        print "Would have blocked"
        # Do something useful here

Я хотел бы проверить, что мой код обработки ошибок работает, поэтому я хотел бы получить send () для блокировки.Проблема в том, что я не могу понять, как это сделать.Я попытался иметь:

BUFFSIZE = 2000
input = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
input.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, BUFFSIZE)
input.bind(('127.0.0.1', 12345))
while True:
    data = input.recv(BUFFSIZE)
    time.sleep(100)

Между сном в течение 100 секунд и установкой небольшого буфера приема, я ожидал бы, что буфер заполнен.Однако этого никогда не происходит.Итак, как я могу получить буфер приема для заполнения, чтобы отправлять блоки?

Я использую Mac OS Lion и версию Python 2.6 для Macports.

1 Ответ

4 голосов
/ 21 ноября 2011

UDP обычно не блокируется. Если получатель имеет полный буфер, пакет молча отбрасывается. Это по замыслу. Если вам нужна надежная транспортная и блокирующая семантика, используйте вместо этого TCP.

Комментарий: Причина, по которой блокируется TCP, заключается в том, что отправитель получает подтверждение для каждого отправляемого им пакета. Отправитель пропускает только определенный объем данных «в пути», который не имеет подтверждения, и блокирует его при достижении этого порогового значения. Поскольку UDP не отправляет подтверждение полученных пакетов, отправитель не может знать, когда блокировать. Конечно, он может решить заблокировать, если он насыщает свой порт Ethernet, но с помощью UDP невозможно определить, насыщена ли ваша восходящая линия, получатель завис, или гремлины съели пакет. Никаких гарантий!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...