我有一個客戶端應用程序,使用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. C函數recvfrom和sendto是否互斥?
- 2. sendto和recvfrom在同一個程序中?
- 3. 使用recvfrom()和sendto()發送結構
- 4. Sendto和recvfrom之間的不同性能
- 5. 是否可以同時執行sendto()recvfrom()?
- 6. UDP穿孔(C++/winsock)
- 7. 關於UDP/IP和sendto/recvfrom返回值的困惑
- 8. UDP的sendto和recvfrom在不同的端口
- 9. C - recvfrom和信號
- 10. UDP sendto()和recvfrom()最大緩衝區大小
- 11. 原始套接字:sendto()和recvfrom()不工作
- 12. flash.net.Socket和C++ winsock WSAECONNRESET
- 13. C++ socket編程:SENDTO()和recvfrom()錯誤代碼10038&在 '服務器' 綁定失敗與10038
- 14. recvfrom的:錯誤地址,SENDTO:地址家族不受協議
- 15. OpenSSL,RSA和Winsock和C++
- 16. C windows sendto()
- 17. C++ Winsock UDP sendto成功但我看不到要發送的數據
- 18. C++ UDP recvfrom WSAGetLastError 10014
- 19. 攔截winsock的recvfrom函數提供了無效地址錯誤
- 20. 套接字程序Python vs C++(Winsock)
- 21. Sendto Failed C++ // POSIX.4
- 22. SENDTO PID和組
- 23. C++ hook winsock
- 24. C++ Winsock結構發送/ recv
- 25. C++ winsock錯誤
- 26. 可以UDP(單播客戶端)recvfrom()除sendto()之外的其他服務器嗎?
- 27. 如何使用winsock(C++)發送\ recv非char數據?
- 28. C++插座 - SENDTO - 沒有數據收到
- 29. C++ Winsock 10093錯誤
- 30. C++ Winsock recv hook Detours
即使只發送一次,recvfrom()是否可以返回兩次相同的數據包? – 2012-04-10 18:57:18
是的,數據包重複可能在傳輸過程中發生。使用UDP,所有投注都將關閉。可靠性。 – modelnine 2012-04-10 18:59:26