CAsyncSocket TCP協議通訊速度慢的問題(轉)
轉自:
https://bbs.csdn.net/topics/70302893?list=lz
兩臺公眾網上的機器用PCAnywhere連線起來後,用PCAnywhere傳輸檔案,速度能達到約50K Byte/s的速度傳輸檔案,一個700K的檔案,也就是幾秒鐘能夠傳輸完成。 自己用MFC寫程式連線,採用tcp/ip協議建立連線,使用了CAsyncSocket建立連線, SOCK_STREAM型別。傳送方,不停地傳送資料,或者在CAsyncSocket::OnSend中傳送資料,接受方在OnReceive中接受資料,速度爆滿,頂多有幾百位元組/秒的傳輸速度。 如果傳送方的報文,也就是每一次CAsyncSocket::Send的報文大小,設定為1K以上,那麼,很可能就堵塞了:很長時間過不來,然後突然間可能過來了。 如果傳送方的報文,也就是每一次CAsyncSocket::Send的報文大小,設定為256或者更小,則報文能斷斷續續過來,可是仍然爆慢。 另外傳送方的傳送緩衝區,如果設定為很大,則大多數報文反而被堵塞。 自己寫程式實現通訊,傳輸700k的檔案,起碼需要半個多小時。相比PcAnywhere的傳輸速度,一個天上一個地下,可是,不知道為什麼? 請問,可能原因是什麼,如何解決? 謝謝! |
謝謝大家關心! 事實上,我也正在希望我的程式有問題,主要是我實在不知道問題在那裡。 測試程式很簡單,server端,一個CAsyncSocket的派生類物件,實現偵聽功能,偵聽成功後,Accept一個CDataSocket物件。Client端,一個CDataSocket物件,直接Connect Server端的Listen地址和埠。然後不對CDataSocket物件做處理,Server端開始向其傳送資料。不停地發,直到發不出去(或者檔案結束),如果發不出去,則等待。Client端,則在OnReceive中Receive資料。僅此而已。 現在可以說說今天努力的結果了: 1,如果不對socket做任何處理,如果Server端傳送的資料包文每次大小(也就是CAsyncSocket::Send的大小)為256位元組以下,則已開始能傳輸,後來就很容易堵塞,然後堵塞很長時間,突然間,能過來一段資料;這個顯然不是我想要的結果。如果Server端傳送的資料包文每次都比較大,比如>1024,則很容易堵塞。 2,後來對Socket作了處理,第一個處理是限制傳送緩衝區的大小,這樣,我只要傳送幾個資料包文,傳送緩衝區就滿了,後面的資料只有等待了。我用了CAsyncSocket::SetSockOpt——好像是這個函式——把傳送緩衝區限制為256/512位元組,效果已經漸漸明顯起來,已經基本上不堵塞了,不過,傳輸速度依然很慢;只是基本上不堵塞了。報文大小設定為128位元組,效果最好; 3,為了再次提高速度,又設定了兩個引數,如下(都是CAsyncSocket::SetSockOpt實現的): (1)TCP_NODELAY=TRUE (2)SO_DONTROUTE 這麼設定之後,速度大大提高,傳輸700K,最快的速度,我除錯出來是2分鐘左右。可是距離PcAnywhere傳輸的速度依然慢很多(它這個基本上30-40秒能搞定)不過,對我現在來說,已經是一個很大的進步了!每個報文設定為128位元組,則總傳輸時間約在2分鐘左右,如果設定為68位元組,則總傳輸時間約在4分半左右。 en.現象就是這樣,程式碼很簡單,可惜,在公司,否則我就copy上來了。 憑我的記憶,寫上一點關鍵程式碼: //接受端 void CDataSocket::OnReceive(int nErrorCode) { if (nErrorCode == 0) { char buf[1024]; while (true) // loop until break { int n = Receive(buf, 1024); if ((n == 0) || (n == -1)) { break; } } } } //傳送端 #define PACKET_SIZE 128 void CDataSocket::SendData(int len, char* buf) { int n = 0; while (n < len) { int m = CAsyncSocket::Send(buf + n, min(PACKET_SIZE, len - n)); if (m > 0) n += m; else if (m == -1) { if (CAsyncSocket::GetLastError() != WSAEWOULDBLOCK) { // error break; } } } } |
相關文章
- 網路通訊協議-TCP協議詳解!協議TCP
- TCP/IP 協議相關的問題TCP協議
- 分散式架構基石-TCP通訊協議分散式架構TCP協議
- TCP協議粘包問題詳解TCP協議
- ModBus RTU與ModBus TCP通訊協議詳解TCP協議
- 為什麼 TCP 協議有效能問題TCP協議
- 分分鐘讀懂tcp/ip通訊協議原理(含視訊)TCP協議
- 通訊協議協議
- Python 基於 TCP 傳輸協議的網路通訊實現PythonTCP協議
- 通訊協議轉換Modbus轉Profinet閘道器協議
- 系列TCP/IP協議-TCP協議概述(011)TCP協議
- TCP協議的常見面試題TCP協議面試題
- 通過故事引申網路協議TCP協議TCP
- Android與物聯網裝置通訊-UDP&TCP協議AndroidUDPTCP協議
- Redis 通訊協議Redis協議
- web通訊協議Web協議
- HTTP通訊協議HTTP協議
- modbus通訊協議協議
- TCP協議TCP協議
- TCP通訊之經典問題解決TCP
- TCP協議服務端和客戶端的連線與通訊TCP協議服務端客戶端
- HTTP協議的通訊框架HTTP協議框架
- WLAN常用的通訊協議協議
- 實用TCP協議(1):TCP 協議簡介TCP協議
- HTTPS的SSL協議速度慢嗎❓HTTP協議
- 網路程式設計協議(TCP和UDP協議,黏包問題)以及socketserver模組程式設計協議TCPUDPServer
- 網路通訊協議協議
- Dubbo-通訊協議協議
- 串列埠通訊協議串列埠協議
- tcp/ip協議TCP協議
- 網路通訊協議-ICMP協議詳解!協議
- 網路通訊協議-HTTP協議詳解!協議HTTP
- 網路通訊協議-SMTP協議詳解!協議
- TCP協議的特點TCP協議
- 工業4G插卡無線路由器解決方案串列埠轉網口通訊TCP/IP協議與UDP協議的區別路由器串列埠TCP協議UDP
- 倍福ADS協議通訊協議
- 15. SPI通訊協議協議
- 輕量通訊協議 --- MQTT協議MQQT