Ⅰ TCP之深入淺出send&recv
接觸過網路開發的人,了解上層應用如何使用send函數發送數據以及recv接收數據。但是,send和recv的實現原理是什麼?本文將簡單介紹TCP中發送緩沖區和接收緩沖區的作用,並講解Linux系統下TCP發送和接收數據的具體實現。
緩沖區在數據傳輸中起著臨時緩存的作用。發送端將數據拷貝到發送緩沖區後,立即返回應用層執行其他操作,而接收端則將網路中的數據拷貝到緩沖區等待應用層讀取。
發送緩沖區在應用層調用send()發送數據時,數據會被拷貝到socket的內核發送緩沖區。send()函數在應用層返回時,並不一定意味著數據已經發送到對端,而是數據已放入socket的內核發送緩沖區。
Linux內核提供兩種方式查看tcp緩沖區大小:通過/etc/sysctl.ronf下的net.ipv4.tcp_wmem值或命令'cat /proc/sys/net/ipv4/tcp_wmem'。以筆者伺服器為例,發送緩沖區大小為4096、16384、4194304。
通過程序可以修改當前tcp socket的發送緩沖區大小,隻影響特定的socket。
接收緩沖區用於緩存網路上來的數據,直至應用進程讀取為止。當應用進程未讀取數據且接收緩沖區已滿時,收端會通知發端接收窗口關閉(win=0),實現TCP的流量控制。
接收緩沖區大小可以通過查看/etc/sysctl.ronf下的net.ipv4.tcp_rmem值或命令'cat /proc/sys/net/ipv4/tcp_rmem'獲取。同樣,可以通過修改程序大小修改接收緩沖區,僅影響當前特定socket。
TCP的四層模型包括應用層、傳輸層、網路層和數據鏈路層。應用層創建socket並建立連接後,可以調用send函數發送數據。傳輸層處理數據,以TCP為例,其主要功能包括流量控制、擁塞控制等。
當發送數據時,數據會從應用層、傳輸層、網路層、數據鏈路層依次傳遞。上圖為send函數源碼調用邏輯圖,若對源碼感興趣,可查閱net/tcp.c獲取詳細實現。
recv函數實現類似,從數據鏈路層接收數據幀,通過網卡驅動處理後,進入內核進行協議層處理,最終將數據放入socket的接收緩沖區。
在實際應用中,非阻塞send時,發送端可能發送了大量數據,但實際只發送了部分,緩沖區中仍有大量數據未發送。接收端recv獲取數據時,可能只收到部分數據。這種情況下,應用層需要正確處理超時、斷開連接等情況。
總結來說,TCP的send和recv函數分別在應用層和傳輸層實現數據的發送和接收,通過內核的緩沖區控制數據的流動。正確理解這些原理對於網路編程至關重要。
Ⅱ QTcpSocket發送接收數據時有大小限制嗎
理論上傳輸數據不會很大,常用的一次webservice數據交互,大小應該不會超過100K,
具體是版否存在大權小限制,這個要看你具體的限制了。
比如我發送一個請求,請求內容是一個人的身份證號碼,你給我返回這個人的所有信息,如果這些信息有1G,我覺得理論上實現起來沒有問題,但是從軟體設計角度,這樣來設計就是有缺陷的,
1G的數據需要傳很久的,按照常用硬碟的讀取速度80M來說,也需要13秒的時間才能傳完,而且對帶寬的要求還必須是千兆的網路。
Ⅲ QTcpSocket如何發送結構體數據
把結構體轉換成一個QString型的就可以write了,然後就可以了。
用QString::fromascii()去轉換吧,或者是QString::fromlocal8bit()去轉換
Ⅳ Qt用Tcp/ip通訊時,緩沖區只有8K,怎麼樣才能設置更大
用QTcpSocket不就很好嗎?tcp協議是安全可靠的通訊協議,你一次發多少都可以,QT底層會處理