【发布时间】:2019-01-30 15:17:07
【问题描述】:
我在这里查看 udp 客户端示例: http://www.linuxhowtos.org/data/6/client_udp.c
sn-p:
/* 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 或其他东西一样永久?似乎有一些永久性的方面。只是对更多细节感兴趣。
【问题讨论】:
-
另一端可能正在使用
recvfrom,它给出了发件人的地址/端口对,并将其用于回复。 -
"它实际上是一个具有随机可用端口号的绑定,就像我调用了绑定一样永久" - 这正是发生的事情