【发布时间】:2009-06-15 10:03:57
【问题描述】:
我正在用 C(单播)创建一个 UDP 套接字客户端,我想知道为什么 recvfrom() 有一个 struct sockaddr * 参数,其中在手册页中说, 空指针,或指向要存储发送地址的 sockaddr 结构。
我是否有可能收到来自不同于我发送到的服务器的消息?如果是,如何创建这个场景?
如果不是,说这个参数只在使用广播模式时有用对吗?
【问题讨论】:
标签: sockets network-programming
我正在用 C(单播)创建一个 UDP 套接字客户端,我想知道为什么 recvfrom() 有一个 struct sockaddr * 参数,其中在手册页中说, 空指针,或指向要存储发送地址的 sockaddr 结构。
我是否有可能收到来自不同于我发送到的服务器的消息?如果是,如何创建这个场景?
如果不是,说这个参数只在使用广播模式时有用对吗?
【问题讨论】:
标签: sockets network-programming
是的,这是完全可能的。这样做的原因是 UDP 不是基于流的,而是基于数据包的。每个数据包都没有任何历史记录(发送或接收的其他数据包)。
出于这个原因,您也可以打开一个 UDP 端口,然后从它向不同的主机发送数据包。但是,我不记得 API 对此的支持情况如何。
【讨论】:
UDP 套接字将recvfrom() 任何具有正确端口的主机发送到此主机,除非您明确地connect(),在这种情况下,您可以只使用write() 和read(),并在收到 ICMP 消息时出错。
【讨论】:
考虑到在 UDP 中总是有两方,显然有人必须先进行 recvfrom()。
【讨论】: