用UDP協議發送時,用sendto函數最大能發送數據的長度為:65535-20-8=65507字節,其中20字節為IP包頭長度,8字節為UDP包頭長度。用sendto函數發送數據時,如果指的的數據長度大於該值,則函數會返回錯誤。
用TCP協議發送時,由於TCP是數據流協議,因此不存在包大小的限制(暫不考慮緩沖區的大小),這是指在
用send函數時,數據長度參數不受限制。而實際上,所指定的這段數據並不一定會一次性發送出去,如果這段數據比較長,可能會被分段發送,如果比較短,可能會等待和下一次數據一起發送。
我在測試的時候,發現長度一般會被切成16384(16K)或49152(48K),不知道這兩個值有什么意義。
比如在send()中設定發送數據的長度為100000,在接收端用recv()函數接收時,接收到的數據長度如下表:
start recvLen: 16384 nu: 0 type: 0
normal recvLen: 16384 nu: 0 type: 0
normal recvLen: 67232 nu: 0 type: 0
-------------------
normal recvLen: 49152 nu: 1 type: 1
normal recvLen: 49152 nu: 0 type: 0
normal recvLen: 1696 nu: -1208847736 type: -1207635502
-------------------
normal recvLen: 49152 nu: 2 type: 1
normal recvLen: 49152 nu: 0 type: 0
normal recvLen: 1696 nu: -1208847736 type: -1207635502
-------------------
從表中可以看出每次發送的100000byte的數據被拆成了3段,這3段長度加起來正好是100000。
經過測試得出如果將send()函數參數中的數據長度設為16384(16K),每次用recv()接收到的長度也為16384,而大於或小於這個值,都會被拆分或合並。
