Python UDP клиент/серверная программа, проблемы

Я пытаюсь написать базовую клиентскую/серверную эхо-программу, чтобы проверить использование таймеров для повторной передачи на основе select() (хотя мне пришлось прокомментировать этот бит, чтобы упростить отладку, когда он не работал как предполагалось). Вот фрагменты соответствующего кода:

Сервер:

from socket import *
import sys
import select
address = ('localhost', 6005)
server_socket = socket(AF_INET, SOCK_DGRAM)
server_socket.bind(address)

while(1):
    print "Listening"
    recv_data, addr = server_socket.recvfrom(2048)
    print recv_data
    if recv_data == "Request 1" :
        print "Received request 1"
        server_socket.sendto("Response 1", address)
    elif recv_data == "Request 2" :
        print "Received request 2"
        data = "Response 2"
        server_socket.sendto(data, address)

Клиент:

from socket import *
import sys
import select

address = ('localhost', 6005)
client_socket = socket(AF_INET, SOCK_DGRAM)

num_retransmits = 0
while(num_retransmits < 60):
    num_retransmits = num_retransmits + 1


    data = "Request 1"
    client_socket.sendto(data, address)
    print "Sending request 1"

    recv_data, addr = client_socket.recvfrom(2048)

    print recv_data, "!!"

Вывод на клиенте - это просто "Отправка запроса 1", а когда точка останова используется на что-либо на вызове recvfrom или ниже, он не достигает точки останова. Поэтому я полагаю, что клиент ничего не получает и держится до этого. С другой стороны, вывод на сервере:

  • Прослушивание
  • Запрос 1
  • Полученный запрос 1
  • Прослушивание
  • Ответ 1

и т.д. и т.д.

После первого цикла сервер снова петлиет и печатает RESPONSE 1. Это означает, что то, что сделал сервер, это получить запрос 1, отправить ответ 1 клиенту, цикл... но после того, как он повторяет второй раз, ответ 1 STILL в своем гнезде! Вот почему, когда он печатает recv_data, он печатает ответ 1. С другой стороны, клиент не печатает recv_data, потому что клиент его не получил - он все еще находится в буфере серверного сокета.

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

Ответ 1

Вы должны отправить addr вместо адреса.

from socket import *
import sys
import select
address = ('localhost', 6005)
server_socket = socket(AF_INET, SOCK_DGRAM)
server_socket.bind(address)

while(1):
    print "Listening"
    recv_data, addr = server_socket.recvfrom(2048)
    print recv_data
    if recv_data == "Request 1" :
        print "Received request 1"
        server_socket.sendto("Response 1", addr)
    elif recv_data == "Request 2" :
        print "Received request 2"
        data = "Response 2"
        server_socket.sendto(data, addr)

Ответ 2

Что происходит, сервер отправляет 'Response 1' в localhost:6005, а затем получает его немедленно, так как он также прослушивает localhost:6005.

Сервер связывается и слушает его (address, port), как это правильно. Когда клиент сначала подключается без привязки, ему автоматически назначается неиспользованный (address, port). Вам нужно будет определить, что (address, port) клиент использует для ответа на него - либо с помощью bind, чтобы явно установить известный (address, port), либо с помощью addr, возвращаемого recvfrom.

Ответ 3

возможно, строка 10 на стороне сервера

recv_data, addr = server_socket.recvfrom(2048)

должен быть

recv_data, addr = server_socket.sendto(2048)

?

ps > Im a noob. = P