Я пытаюсь написать базовую клиентскую/серверную эхо-программу, чтобы проверить использование таймеров для повторной передачи на основе 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.