地址家族名字解析學習筆記

Wi n s o c k中,應用通過S O C K A D D R _ I N結構來指定I P地址和服務端口信息,該結構的格式如下:
struct sockaddr_in
{
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
s i n _ f a m i l y字段必須設爲A F _ I N E T,以告知Wi n s o c k我們此時正在使用I P地址家族。
準備使用哪個T C P或U D P通信端口來標識服務器服務這一問題,則由s i n _ p o r t字段定義。如果發現要綁定的端口已經被佔用會返回一個WSAEADDRINUSE錯誤。
sin_addr字段用於把一個IP地址保存到一個4字節無符號整數類型中
sin_zero只充當填充項的責任,以使SOCKADDR_IN結構和SOCKADDR結構的長度一樣
(inet_addr函數可以把一個點式的IP地址轉換成一個32位的無符號長整數,定義爲:
unsigned long inet_addr(
const char FAR* cp
); //cp字段是一個空終止字符串,它接受通常使用的點格式)
特殊地址:對於特定情況下的套接字行爲,有兩個特殊I P 地址可對它們產生影響。特殊地址
I N A D D R _ A N Y允許服務器應用監聽主機計算機上面每個網絡接口上的客戶機活動。一般情況下,在該地址綁定套接字和本地接口時,網絡應用才利用這個地址來監聽連接。如果你有一個多址系統,這個地址就允許一個獨立應用接受發自多個接口的迴應。特殊地址I N A D D R _ B R O A D C A S T用於在一個I P網絡中發送廣播U D P數據報。要使用這個特殊地址,需要應用設置套接字選項S O _ B R O A D C A S T。
字節順序一共有兩種方法表示多字節編號,主機順序:從最無意義到最有意義的順序,INTER 86處理器用的就是這種方式。網絡順序:從最有意義到最無意義。互聯網標準。
將一個數從主機順序轉換爲網絡順序的函數有:
u_long htonl(u_long hostlong);
int WSAHtonl(
SOCKET s;
u_long hostlong; //主機順序的4字節數
u_long FAR* lpnetlong //返回的網絡字節順序
);
u_short htons(u_short hostshort);
int WSAHtons(
SOCKET s;
u_short hostshort; //主機順序的2字節數
u_short FAR* lpnetshort //返回的網絡字節順序
);
把網絡字節順序轉換爲主機字節順序的函數有:
u_long ntohl(u_long netlong);
int WSANtohl(
SOCKET S;
u_long netlong;
u_long FAR* lphostlong
);
u_short ntohs(u_short netshort);
int WSANtohs(
SOCKET s;
u_short netshort;
u_short FAR* lphostshort
);
winsock提供了兩個函數g e t h o s t b y n a m e和WSAAsynGetHostByName用來支持名字解釋,把主機名轉換爲HOSTENT結構如下
struct hostent
{
char FAR* h_name; //主機名
char FAR* FAR* h_aliases; //由主機備用名組成的空終止數組
short h_addrtype; //返回的地址家族
short h_length; //對h_addr_list字段中每一個地址定義字節長度
char FAR* FAR* h_addr_list; //由主機IP地址組成的空終止數組(一個主機名對應多個地址)
};
struct hostent FAR* gethostbyname(
const char FAR* name
);
HANDLE WSAAsyncGetHostByName( //gethostbyname的異步版本
HWND hWnd; //接受消息的窗口句柄
unsigned int wMsg; //接收到的窗口消息
const char FAR* name; //主機名
char FAR* buf; //只想接收HOSTENT數據的那個數據域大小應設爲MAXGETHOSTSTRUCT
int buflen
);
g e t h o s t b y a d d r和WSAAsynGetHostByName API函數,它們是爲獲得與I P網絡地址相應的主機信息而設計的。
struct HOSTENT FAR* gethostbyaddr(
const char FAR* addr; //指向IP地址的指針按網絡字節順序排列
int len;
int type //指定AF_INET值
);
g e t s e r v b y n a m e和W S A A s y n c G e t S e r v B y N a m e函數,便可獲得已知服務的端口號。
struct servent FAR* getservbyname(
const char FAR* name;
const char FAR* proto
);
紅外線..............
IPX/SPX.............
NetBIOS.............
AppleTalk(蘋果公司)......
ATM(異步傳輸模式協議).....
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章