將網絡地址(u_long)轉化爲點分十進制ip地址

wchar_t *buf =  new wchar_t(15);
u_long a = 1955339436;
BYTE *cp = (BYTE *)&a;
(void) swprintf(buf, L"%u.%u.%u.%u", cp[0], cp[1], cp[2], cp[3]);

 

 

 

 //獲取主機的信息
 LPHOSTENT hostEntry;
 char hostname[MAX_NUM_BUF];
 gethostname(hostname,MAX_NUM_BUF);   //獲取主機名稱
 hostEntry = gethostbyname(hostname);  //獲取主機信息
 if(!hostEntry)
 {
  ShowErrorMsg();       //顯示錯誤信息
  return ExitClient(CLIENT_API_ERROR); //退出
 }
 //設置sockaddr_in
 SOCKADDR_IN addrServ;
 addrServ.sin_family = AF_INET;
 addrServ.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list);
 addrServ.sin_port = htons(SERVERPORT);

//客戶端地址設置

addr.sin_family = AF_INET;
addr.sin_port=htons(PORT);
addr.sin_addr.s_S_un.s_addr = inet_addr(SERVER_IP);
 
基於阻塞型 tcp 的套接字
1 :recv()函數的 緩衝區  一定不能是用過的  要不然  recv會返回 錯誤
2 :accept()函數中的 第三個參數   要有 初始值 sizeof(SOCKADDR) 要不然  也會返回錯誤

四、幾個需要注意的函數

(1)IP地址相關,inet_addr()和inet_ntoa()

用法:inet_addr(“127.0.0.1”);將點分十進制記的IP地址轉換成爲網絡字節序的S_addr類型的IP地址

           inet_ntoa(addrClient.sin_addr);將網絡字節序的S_addr類型的IP地址轉換成爲點分十進制記的IP地址

(2)端口號相關,htonl()和htons()

用法:htonl(INADDR_ANY);把一個u_long類型的值從主機字節序轉換成爲TCP/IP網絡字節順序

           htons(6000);把一個u_short類型的值從主機字節序轉換成爲TCP/IP網絡字節順序

           INADDR_ANY這個宏的值就是0,轉換之後仍然是0

5::關於端口號
0--65535  0不能用  65535 可以  還有1024爲系統 留給預定義的 端口  我們也能用 但是肯定會干擾 其他服務。。。

1  爲了標識通信實體中進行通信的進程(應用程序),TCP/IP協議提出了協議端口的概念

2.      端口是一種抽象的軟件結構(包括一些數據結構和I/O緩衝區)。應用程序通過系統調用和某端口建立連接(binding)後,傳輸層傳給該端口的數據都被相應的進程所接收,相應進程發給傳輸層的數據都通過該端口輸出

3.      端口用一個整數型標識符來表示,即端口號。端口號跟協議相關,TCP/IP傳輸層的兩個協議TCP和UDP是完全獨立的的兩個軟件模塊,因此各自的端口號也相互獨立

 

SOCK_STREAM類型的套接口爲全雙向的字節流。對於流類套接口,在接收或發送數據前必需處於已連接狀態。用connect()調用建立與另一套接口的連接,連接成功後,即可用send()和recv()傳送數據。當會話結束後,調用closesocket()。帶外數據根據規定用send()和recv()來接收。
實現SOCK_STREAM類型套接口的通訊協議保證數據不會丟失也不會重複。如果終端協議有緩衝區空間,且數據不能在一定時間成功發送,則認爲連接中斷,其後續的調用也將以WSAETIMEOUT錯誤返回。
SOCK_DGRAM類型套接口允許使用sendto()和recvfrom()從任意端口發送或接收數據報。如果這樣一個套接口connect()與一個指定端口連接,則可用send()和recv()與該端口進行數據報的發送與接收。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章