@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()
  • Вопрос задан
  • 50 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
Но как тогда он потом принимает сообщения методом data = udp_socket.recvfrom(1024), если сокет не привязан к его адресу?

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

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

Войти через TM ID
Похожие вопросы
Popmechanic Москва
от 100 000 до 150 000 руб.
Panda Media Нижний Новгород
от 70 000 руб.
НЛ Континент Новосибирск
от 60 000 до 100 000 руб.
15 авг. 2018, в 23:38
300 руб./за проект
15 авг. 2018, в 22:39
60000 руб./за проект
15 авг. 2018, в 21:18
30000 руб./за проект