Я смотрю на пример клиента udp здесь: http://www.linuxhowtos.org/data/6/client_udp.c
фрагмент:
/* UDP client in the internet domain */
struct sockaddr_in server, from;
//...snipped
sock= socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) error("socket");
server.sin_family = AF_INET;
hp = gethostbyname(argv[1]);
if (hp==0) error("Unknown host");
bcopy((char *)hp->h_addr,
(char *)&server.sin_addr,
hp->h_length);
server.sin_port = htons(atoi(argv[2]));
length=sizeof(struct sockaddr_in);
//... snipped
n=sendto(sock,buffer,
strlen(buffer),0,(const struct sockaddr *)&server,length);
if (n < 0) error("Sendto");
n = recvfrom(sock,buffer,256,0,(struct sockaddr *)&from, &length);
if (n < 0) error("recvfrom");
//... snipped
Я пытаюсь понять, как он знает, откуда получить сообщение.Я знаю, когда sendto
вызывается, выбирается доступный порт, который встроен в сообщение udp, и серверное приложение может прочитать его и ответить на него.Как клиентский код узнает, что получил сообщение на этот порт?
Этот ответ: https://stackoverflow.com/a/48245273/2748602 указывает на наличие неявного связывания при вызове функции sendto
.Как это работает?Это на самом деле привязка со случайным номером доступного порта, который является постоянным, как если бы я звонил bind
, или что-то еще?Кажется, есть какой-то аспект постоянства.Просто интересуюсь чуть более подробно.