歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

套接字網絡編程筆記

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之上的協議,即應用層協議,指示數據包長度。最簡單的實現為:

  1. void SendFn(SOCKET s, char* data, int len)  
  2. {  
  3.     char* buff = (char*)malloc(sizeof(int)+len);  
  4.   
  5.     //填充報文頭   
  6.     int* pLen = (int*)buff;  
  7.     *pLen = len;  
  8.   
  9.     //填充有效數據   
  10.     memcpy(buff+sizeof(int), data, len);  
  11.   
  12.     send(s, buff, sizeof(int)+len, 0);  
  13. }  
  14.   
  15. //完整接收指定長度數據包   
  16. void RecvFnS(SOCKET s, char* buff, int len)  
  17. {  
  18.     int done = 0;  
  19.     done = recv(s, buff, len, 0);  
  20.   
  21.     while ( done < len )  
  22.         done += recv(s, buff+done, len, 0);  
  23. }  
  24.   
  25. void RecvFn(SOCKET s)  
  26. {  
  27.     int len;  
  28.     //接收報文頭   
  29.     RecvFnS(s, (char*)&len, sizeof(int));  
  30.   
  31.     //接收有效數據   
  32.     if ( len > 0 )  
  33.     {     
  34.         char* buff = (char*)malloc(len);  
  35.         RecvFnS(s, buff, len);  
  36.     }  
  37. }  

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不能叫連接)。

Copyright © Linux教程網 All Rights Reserved