我在C(单播)中创建一个UDP套接字客户端,并想知道为什么recvfrom()有一个struct sockaddr *参数,其中在手册页中说明了一个空指针,或指向一个sockaddr结构,其中发送地址是存储 .
我是否有可能从我发送的服务器以外的其他服务器收到消息?如果是,如何创建此方案?
如果不是,说这个参数仅在使用广播模式时有用是否正确?
是的,这是完全可能的 . 这样做的原因是UDP不是基于流的,而是基于数据包的 . 处理每个数据包时没有任何历史记录(发送或接收其他数据包) .
因此,您还可以打开UDP端口,然后从中将数据包发送到不同的主机 . 但是,我不记得API如何支持它 .
UDP套接字将 recvfrom() 任何主机发送到具有正确端口的主机,除非您明确 connect() ,在这种情况下您只能 write() 和 read() ,并在收到ICMP消息时收到错误 .
recvfrom()
connect()
write()
read()
考虑到你总是在UDP中有两方,似乎很明显有人必须首先recvfrom() .
3 回答
是的,这是完全可能的 . 这样做的原因是UDP不是基于流的,而是基于数据包的 . 处理每个数据包时没有任何历史记录(发送或接收其他数据包) .
因此,您还可以打开UDP端口,然后从中将数据包发送到不同的主机 . 但是,我不记得API如何支持它 .
UDP套接字将
recvfrom()
任何主机发送到具有正确端口的主机,除非您明确connect()
,在这种情况下您只能write()
和read()
,并在收到ICMP消息时收到错误 .考虑到你总是在UDP中有两方,似乎很明显有人必须首先recvfrom() .