有一個客戶端和一個服務器,在應用層,客戶端發送數據包到服務器的隨機有效載荷大小。這意味着一個數據包可以是1300個字節,下一個數據包可以是450個字節,下一個數據包可以是1449個字節,依此類推。在服務器如何讀取從客戶端傳入的有效載荷數據?你的套接字應該讀多少數據?考慮到客戶端無法發送它發送的有效負載大小的事實。服務器如何區分1300,450和1449字節的單個數據包。我們在C中使用POSIX套接字,並在應用層工作。任何代碼片段都會有所幫助。如何計算數據包有效負載中的字節數?
0
A
回答
0
一般而言,您只需發出一個帶有足夠緩衝區的recv()
以容納您期望的最大數據報。返回值將反映數據報的實際大小。
POSIX並未指定檢查下一個數據報大小的方法(除了讀取它)。
但是,對於某些協議,Linux和BSD系統可以;對於其他人,它會返回已經接收的可用字節數。如果您正在使用例如UDP socket,那麼您可以使用FIONREAD
ioctl()
。這裏有一個例子:
#include <sys/socket.h>
#include <sys/ioctl.h>
size_t unread(const int socketfd)
{
int length = 0;
if (ioctl(socketfd, FIONREAD, &length))
return 0;
if (length < 0)
return 0;
return (size_t)length;
}
當然,這不會真的告訴你是否有收到數據掛起。首先,它可能剛好在ioctl()
之後到達。另外,可以發送零長度的數據報。上面的函數在接收到的數據報和收到的長度爲零的數據報上都會返回零,並且錯誤(套接字協議不支持ioctl)。
相關問題
- 1. 套接字術語:數據包與有效負載
- 2. 如何計算DataTable中存儲的數據的字節數
- 3. 如何有效計算負二項累積分佈函數?
- 4. 丟棄數據包有效負載的工具?
- 5. Windows過濾平臺:訪問數據包的有效負載
- 6. 充分利用Python的TCP數據包有效負載和impacket
- 7. 使用TCPREPLAY添加時間戳到數據包有效負載
- 8. Java字節數組包含負數
- 9. 計算MB的字節數
- 10. Sequelize包含在數據庫中計算的計算字段嗎?
- 11. 計算節點js中的數據字節
- 12. 如何將SFTP字節有效載荷轉換爲數據編織中的java
- 13. 計算C#中的字節數UdpClient.Send()數據報
- 14. Golang中如何計算字節中有多少位字節?
- 15. 找到具有相同有效負載的TCP數據包的概率?
- 16. 有效負載中的意外字符
- 17. 如何確定TCP數據包中數據有效載荷的啓動?
- 18. 如何計算最有效的階乘數字
- 19. 進行關於MySQL的計算負載數據
- 20. 如何檢查數字(包括負數)?
- 21. 如何計算數據流的最佳UDP數據包大小?
- 22. ns3數據包有效載荷打印
- 23. 如何在Python中有效地計算超大型數據集的基數?
- 24. 負載數據
- 25. 負載數據
- 26. 我如何處理Firebase雲消息傳遞中的數據有效負載?
- 27. Flex中的數據包丟失計算
- 28. VS負載測試和'發送總字節'性能計數器?
- 29. 如何使用C來計算文件中的字節數?
- 30. 如何最好地計算TextArea中文本的字節數
你使用什麼協議?即socket調用的參數是什麼? – pat
'任何代碼片段都會有所幫助'是的,確切的說,這會幫助我們理解您的問題;-)請認真編輯問題以便它適合您。 – kebs
這是用於TCP還是UDP?我假設TCP,考慮到「*客戶端無法發送它發送的有效載荷大小*」在UDP上不會是問題,只有TCP。爲什麼客戶端無法發送有效負載大小?在TCP中,除非發送者發送有效載荷大小或唯一的消息分隔符,否則無法區分消息邊界。消息有效載荷實際上是什麼樣的? –