@ALEXOR1302

Почему при приеме данных сокеты не привязываются к адресу?

Написал простой обмен сообщениями, по факту все работает, только не могу понять одного, почему тот, кто первый отравляет сообщение, не привязывает адрес методом udp_socket.bind(addr)? Ну в принципе, это понятно: потому что в противном случае он бы подумал, что нужно прослушивать этот порт не на своем интерфейсе и выдал бы ошибку. Но как тогда он потом принимает сообщения методом data = udp_socket.recvfrom(1024), если сокет не привязан к его адресу?
Первый отправитель:
import socket
import sys

host = '192.168.1.37'
port = 7770
addr = (host,port)

udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

while True:
    data = input("Отправьте сообщение: ")
    data = str.encode(data)
    udp_socket.sendto(data, addr)

    data = udp_socket.recvfrom(1024)
    print("Вам письмо: ", data[0].decode())


udp_socket.close()


Первый получатель:
#Модуль socket для сетевого программирования
import socket
import struct
#данные сервера
host = '192.168.1.37'
port = 7770
addr = (host,port)
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#bind - связывает адрес и порт с сокетом
udp_socket.bind(addr)

#Бесконечный цикл работы программы
while True:
    
    
    #recvfrom - получает UDP сообщения
    conn, addr = udp_socket.recvfrom(1024)
    res = conn.decode()
    print("Вам сообщение: " ,conn)
    reply = input("Что ответите? ")
    reply = str.encode(reply)
    #sendto - передача сообщения UDP
    udp_socket.sendto(reply, addr)
    
  
udp_socket.close()
  • Вопрос задан
  • 149 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Но как тогда он потом принимает сообщения методом data = udp_socket.recvfrom(1024), если сокет не привязан к его адресу?

Перед отправкой данных через непривязанный сокет он неявно привязывается, потому что в UDP-пакете должен быть порт отправителя, а в содержащем его IP-пакете должен быть адрес отправителя. Посмотреть куда привязан сокет можно через getsockname.
Получатель запоминает с какого адреса пришло сообщение:
conn, addr = udp_socket.recvfrom(1024)
и отправляет свой ответ обратно на этот адрес:
udp_socket.sendto(reply, addr)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
28 мар. 2024, в 21:17
5000 руб./за проект
28 мар. 2024, в 20:46
150000 руб./за проект
28 мар. 2024, в 20:37
50000 руб./за проект