2016-11-20 891 views
0

有一個客戶端和一個服務器,在應用層,客戶端發送數據包到服務器的隨機有效載荷大小。這意味着一個數據包可以是1300個字節,下一個數據包可以是450個字節,下一個數據包可以是1449個字節,依此類推。在服務器如何讀取從客戶端傳入的有效載荷數據?你的套接字應該讀多少數據?考慮到客戶端無法發送它發送的有效負載大小的事實。服務器如何區分1300,450和1449字節的單個數據包。我們在C中使用POSIX套接字,並在應用層工作。任何代碼片段都會有所幫助。如何計算數據包有效負載中的字節數?

+0

你使用什麼協議?即socket調用的參數是什麼? – pat

+1

'任何代碼片段都會有所幫助'是的,確切的說,這會幫助我們理解您的問題;-)請認真編輯問題以便它適合您。 – kebs

+0

這是用於TCP還是UDP?我假設TCP,考慮到「*客戶端無法發送它發送的有效載荷大小*」在UDP上不會是問題,只有TCP。爲什麼客戶端無法發送有效負載大小?在TCP中,除非發送者發送有效載荷大小或唯一的消息分隔符,否則無法區分消息邊界。消息有效載荷實際上是什麼樣的? –

回答

0

一般而言,您只需發出一個帶有足夠緩衝區的recv()以容納您期望的最大數據報。返回值將反映數據報的實際大小。

POSIX並未指定檢查下一個數據報大小的方法(除了讀取它)。

但是,對於某些協議,Linux和BSD系統可以;對於其他人,它會返回已經接收的可用字節數。如果您正在使用例如UDP socket,那麼您可以使用FIONREADioctl()。這裏有一個例子:

#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)。