我目前正在编写一个供个人使用的小型UDP套接字库,但我一直无法找到相关文档。
我引用的功能是ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
,来自POSIX <sys/socket.h>
标题。
无论src_addr
是成功还是失败,我都希望重用传递给recvfrom的sendto
结构与recvfrom
(相同的标题)一起使用。成功时,它将包含发送数据的对等方的地址(在我的用例中只有一个),这是预期的行为;但是,当非阻塞读取失败时,它会生成错误EAGAIN
,然后src_addr
的状态不清楚。如果src_addr
未被修改,它仍将包含目标地址并可以重复使用,但如果是,那么我将不得不使用临时变量。
答案 0 :(得分:2)
我刚刚处理过同样的问题。 为了增加你的困惑,我发现了两个不同的结果:
recvfrom()
似乎在没有接收到字节时将{0}放入from
参数from
recvfrom()
参数保持不变
我更喜欢RTOS的实现,因为我的应用程序采用了懒惰的方法,将指针放到套接字的已知远程IP地址上。这个地址后来用于sendto()
调用,就像@Techwolf那样。我花了一段时间才弄清楚为什么相同的代码在WinCE下不起作用。
相反,我遵循@ Dummy00001的建议来选择稳健性。 通过使用临时变量,应用程序可以在我的两个平台上运行。
顺便说一句,我的应用程序在某些情况下会对远程主机进行“自动检测”。 temp变量的目的是在这种情况下服务。我将它复制回与此套接字关联的常设成员 - 但仅当recvfrom()
返回正数字节时才会发送!