各位大佬,
小弟在做tcp通信的時候遇到了一些問題,請求大家幫助!
1. 我用IOT設備給服務器發送資料,一次發送資料長度為3088個字符,在服務器端資料會被自動分割成三包,長度分別為1440,1440,288。我理解這是因為TCP通信時存在MTU限制的問題,但我如果用python寫一個client和一個server本地通信,發送同樣長度3088個字符的資料,就可以一次接收到。不明白這是為什么?
2. 我在接收端怎么能看到tcp資料包報頭的內容?因為可能會涉及多個客戶端同時向服務器發送資料,希望能夠通過報頭來對資料進行排序整理,不會導致不同客戶端來的資料誤放在一起。或者各位大佬有沒有更好的解決方案,求教!
uj5u.com熱心網友回復:
第一個問題,iot設備處理和發送資料的速度和帶寬都是很有限的,一次發送超過mtu的資料到了底層都會被自動切割,服務器端處理速度快,在做recv動作的時候可能就是看到資料包是一個一個的來的。python本地通訊的能夠一次接收到,這是tcp協議堆疊底層的粘包處理,把到達接收端的資料按順序粘在一起,服務器端recv的資料接收區是大于等于整個發送端發送資料的長度的。如果接識訓沖區小于發送的資料長度,服務端還是要分幾次才能把資料收齊的。第二個問題,服務端的accept的第二個引數sockaddr就是客戶端的IP地址和埠號,當然上層應用不能使用這個,因為IOT設備的資料包的包頭地址資訊可能在經過路由NAT后會被替換掉,建議在IOT呼叫send時在有效資料里加上IOT的mac地址或者SN號來區分各個設備,服務端來區分就可以。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/57581.html
標籤:網絡通信
上一篇:網關
下一篇:mapinfo問題
