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