recvfrom()是否会在出错时修改src_addr?

时间:2015-07-08 05:08:40

标签: c++ c sockets udp posix

我目前正在编写一个供个人使用的小型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未被修改,它仍将包含目标地址并可以重复使用,但如果是,那么我将不得不使用临时变量。

1 个答案:

答案 0 :(得分:2)

我刚刚处理过同样的问题。 为了增加你的困惑,我发现了两个不同的结果:

  • 在WinCE 5.0上,recvfrom()似乎在没有接收到字节时将{0}放入from参数
  • 在On-Time RTOS(声称与Win * API兼容)下,from
  • recvfrom()参数保持不变

我更喜欢RTOS的实现,因为我的应用程序采用了懒惰的方法,将指针放到套接字的已知远程IP地址上。这个地址后来用于sendto()调用,就像@Techwolf那样。我花了一段时间才弄清楚为什么相同的代码在WinCE下不起作用。

相反,我遵循@ Dummy00001的建议来选择稳健性。 通过使用临时变量,应用程序可以在我的两个平台上运行。

顺便说一句,我的应用程序在某些情况下会对远程主机进行“自动检测”。 temp变量的目的是在这种情况下服务。我将它复制回与此套接字关联的常设成员 - 但仅当recvfrom()返回正数字节时才会发送!