我有一个客户端应用程序,使用winsock的sendto()
方法向UDP发送数据到服务器应用程序。在我的客户端应用程序上,比如说5快速sendto()
。在我的服务器应用程序中,我等待10秒,然后执行select()
和recvfrom()
。 recvfrom()
会给我客户端发送的第一个数据包,还是将它作为任意数据包(无论哪个首先到达)?我仍然能够获得其他4个数据包,或者winsock的UDP框架只缓冲一个吗?C++ winsock recvfrom()和sendto()
回答
UDP不保证数据包的接收顺序,所以基本上,第一个包,你recvfrom()
可能是你发出的第一个包,但决不能 - 这就是TCP是(这保证了接收数据的排序)。如果他们在运输途中丢失,你可能根本没有收到部分数据包(或者任何数据包)。对于第二部分:通常,操作系统会为您缓冲一定数量的数据包,这取决于为UDP套接字设置的套接字缓冲区 - 缓冲区是特定于每个套接字的,并且不在它们之间共享。在Windows上,我不确定如何在Linux上获取缓冲区的大小,请查看“/ proc/sys/net/ipv4/udp_mem”;一般来说,您可以轻松地在其中安装五个UDP数据包。
请问recvfrom的()给我通过客户端发送的第一个数据包或 会是一个任意
由于UDP不处理重新排序,你可以得到任何消息。你可以得到少于4条消息甚至更多(但是今天很少见)。
合理尺寸的5个数据包,你会可能得到的所有数据包,你会可能拿到第一个先发。但它们可能无序,可能不会到达,并且如果它们到达,可能不包含原始数据。你必须用UDP来处理所有这些。 (但是,根据您的应用程序和要求以及网络的稳定性,这可能不是一个真正的问题;在某些情况下,99%的数据完全可以接受)。
虽然UDP很可能至少数据是正确的,因为UDP有一些基本的校验和内置。 – 2012-04-10 18:33:02
如果源主机启用了UDP校验和 - 主机可能选择不在发送端使用UDP校验和。 – modelnine 2012-04-10 18:33:40
- 1. sendto和recvfrom在同一个程序中?
- 2. 使用recvfrom()和sendto()发送结构
- 3. 是否可以同时执行sendto()recvfrom()?
- 4. 关于UDP/IP和sendto/recvfrom返回值的困惑
- 5. UDP sendto()和recvfrom()最大缓冲区大小
- 6. 原始套接字:sendto()和recvfrom()不工作
- 7. C++ socket编程:SENDTO()和recvfrom()错误代码10038&在 '服务器' 绑定失败与10038
- 8. flash.net.Socket和C++ winsock WSAECONNRESET
- 9. OpenSSL,RSA和Winsock和C++
- 10. C windows sendto()
- 11. C++ UDP recvfrom WSAGetLastError 10014
- 12. 拦截winsock的recvfrom函数提供了无效地址错误
- 13. C++ hook winsock
- 14. 可以UDP(单播客户端)recvfrom()除sendto()之外的其他服务器吗?
- 15. C++ Winsock结构发送/ recv
- 16. C++ winsock错误
- 17. C++插座 - SENDTO - 没有数据收到
- 18. C++ udp recvfrom减少下降
- 19. C++ Winsock 10093错误
- 20. 套接字UDP:使用来自SendTo()中的Recvfrom()的发件人信息失败
- 21. C++ Winsock recv hook Detours
- 22. C sockaddr函数调用sendto?
- 23. WINVER,winsock和htonl()
- 24. ASP.net(MVC)和Winsock
- 25. Winsock监听和接受函数(C++)
- 26. 在winsock中检索套接字协议
- 27. C网络编程 - Winsock
- 28. Winsock C++连接超时
- 29. C winsock“滚动分析”
- 30. Winsock C++ - Java Connection Slow Speed
即使只发送一次,recvfrom()是否可以返回两次相同的数据包? – 2012-04-10 18:57:18
是的,数据包重复可能在传输过程中发生。使用UDP,所有投注都将关闭。可靠性。 – modelnine 2012-04-10 18:59:26