1.調用int send( __in SOCKET s, __in const char* buf, __in int len, __in int flags); 發出的數據包,在傳送過程中,雖然順序不會把打亂,但可能會拆分成多個包,這樣,只調用一次int recv( __in SOCKET s, __out char* buf, __in int len, __in int flags); 可能不能被完整地接收。
解決的方法是,定義TCP之上的協議,即應用層協議,指示數據包長度。最簡單的實現為:
2.TCP通信時,服務器用SOCKET accept( __in SOCKET s, __out struct sockaddr* addr, __inout int* addrlen); 創建的套接字共同占用一個端口,即服務器監聽端口。
為什麼要這麼做:客服端套接字指定通信對方的端口就是監聽端口,沒有理由找一個使用其它端口的套接字跟它連接。
為什麼能這麼做:TCP報文中,包含源端口,與目標端口,再加上IP層的源IP地址及目標IP地址,這四個信息,就是運輸層多路分解中,所需要的四元組,意思是可以唯一確定一個TCP連接。當從IP層,解包數據後,就可以根據四元組,找到這些數據的目標TCP連接。這點跟UDP連接是有區別的,因為UDP多路分解時只使用目標IP地址及目標端口,所以,只要目標IP為本機IP,目標端口為監聽端口的,UDP連接都會定向到一個UPD連接。這意味,UDP是一個一對多的連接(確切地說UPD不能叫連接)。