我寫了一個簡單的客戶端服務器程序。 Network.h是一個頭文件,它使用Winsock2.h(TCP/IP模式)創建套接字,在阻塞模式下接受/連接,在非阻塞模式下發送/接收。我做了這樣的功能string TNetwork::Recv(int size)
將返回字符串「無」,如果它得到WSAWOULDBLOCK錯誤(沒有數據尚未收到)Winsock2 tcp/ip - 一些數據包被忽略可能是由於前一個數據包的空終止符
這裏是我的主要功能:
int main(){
string Ans;
TNetwork::StartUp(); //WSA start up, etc
cin >> Ans;
if (Ans == "0"){ // 0 --> server
TNetwork::SetupAsServer(); //accept connection (in blocking mode!)
while (true){
TNetwork::Send("\nAss" + '\0'); //without null terminator, the client may read extra bytes, causing undefined behavior (?)
TNetwork::Send("embly" + '\0');
cin >> Ans;
}
}
else{ // others --> regard Ans as IP address. e.g. I can type "127.0.0.1"
TNetwork::SetupAsClient(Ans);
string Rec;
while (true){
Rec = TNetwork::Recv(1000);
if (Rec != "Nothing"){
cout << Rec;
}
}
}
system("PAUSE");
}
據稱,客戶端將打印「彙編」連接時,以及服務器何時將任何內容輸入到其控制檯窗口。有時候,客戶端只會在控制檯中打印出「\ nAss」,而不會顯示「embly。
據我的理解,TCP/IP確保所有數據都以正確的順序發送,所以我猜會發生什麼是兩個數據包同時到達,這通常發生在不穩定的互聯網上,而且由於這個終止符爲null,客戶端會忽略「embly」,因爲Recv()函數在遇到空終止符時停止讀取。
所以,我怎麼能保證客戶端將始終正確地讀取所有的數據包?
如果有解決方案發送沒有空終止符的數據包,不知何故,我也不介意。如果它有效,我會更改代碼的任何部分。我對winsock2比較陌生(以及套接字編程),所以我可能有一些基本的錯誤。 –
空終止和TCP沒有任何關係。你在這裏吠叫錯誤的樹。 TCP發送和接收API採用指針和長度參數,並且它們不對任何內容進行解釋。 – EJP