Я пытаюсь написать базовую клиент-серверную эхо-программу, чтобы проверить использование таймеров для повторной передачи на основе 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
- Listening
- Ответ 1
и так далее и тому подобное
После первого цикла сервер снова зацикливается и печатает RESPONSE 1. Это означает, что сервер должен был получить запрос 1, отправить ответ 1 клиенту, зациклить ... но после второго цикла ответ 1 все еще в своем гнезде! Вот почему, когда он печатает recv_data, он печатает ответ 1. С другой стороны, клиент не печатает recv_data, потому что клиент его не получил - он все еще находится в буфере сокета сервера.
Пожалуйста, помогите - я попытался просмотреть другие эхо-программы, но все они, кажется, используют TCP и довольно просты (и я думаю, что я в значительной степени выполнил те же шаги). Я понятия не имею, почему моя программа UDP не работает. Я попытался посмотреть на вызов sendall (), но, похоже, он работает только для TCP.