2011-11-15 81 views
1

如何在C++ socket tcp/ip中異步發送和接收數據和確認?,我可以在我的程序中看到當發送一些145字節的數據50次時,我將收到前六個確認,因爲它需要時間給予承認。我嘗試等待,直到收到當前發送的數據確認信息,但這需要很長時間,我不想這樣做。我想處理數據。所以我認爲我會把收到在一個單獨的線程。我想在發送過程中同時處理接收?所以異步接收將工作?誰能幫忙?我用來接收和發送數據的類是一個靜態類。因爲我需要從另外兩個類中調用才能將數據發送到相同的IP和端口。如何在C++ socket tcp/ip中異步發送和接收數據和確認?

+0

什麼平臺?更好地使用boost:asio ... – neagoegab

+0

Windows平臺。 – Ershad

+0

除非它是一箇舊協議,否則在使用'SOCK_STREAM'套接字時,您確實不需要確認,因爲它已內置到底層TCP協議中。我不明白在不同的線程中接收/發送會是一個問題,但我從來沒有嘗試過,所以我很好奇它是如何發生的。但是如果你不想等待Ack,爲什麼不直接發送所有的數據,等待Ack?只需將接收緩衝區設置得足夠大以適應所有情況。 –

回答

1

您可以使用套接字同時在一個線程中發送數據並在另一個線程中接收數據。你不能做的事情是從不同的線程在同一個套接字上執行相同的動作(發送或接收)。

儘管如此,總是儘量避免添加新的線程,如果不必要的話。您可以使用一些套接字函數(select,WSAEventSelect),它們會在您可以在套接字上執行讀取/寫入時通知您。把它們放入單個線程的循環中,等待事件並處理它們 - 在同一個線程中讀/寫。如果您需要處理收到的數據並且需要時間,請將接收到的數據存儲在與另一個數據處理線程共享的隊列中。當然,請記住,您需要使此隊列線程安全並同步套接字和數據處理線程。

+1

或使用完成端口... – neagoegab

+0

+1進行評論。我同意,如果需要擴展性,完成端口是最好的(如果不是唯一的話)選擇。 –

0

如果在POSIX系統中,你可能會如果你的系統是不Posix的(例如窗戶)需要複用系統調用,比如pollppollpselectselect

,你應該找一些類似的功能,或者使用線程。

+0

如果我把不同的線程放在一起,會發生套接字的斷開,因爲發送和接收都將使用相同的套接字。 – Ershad

+0

如果你想在*相同的機器上的不同線程之間進行通信,TCP/IP是過度殺傷。 (在Linux上,管道或AF_UNIX套接字速度更快)。 –