1、讀取當前錯誤值:每次發生錯誤時,如果要對具體問題進行處理,那麼就應該調用這個函數取得錯誤碼。
int WSAGetLastError(void ); #define h_errno WSAGetLastError()
錯誤值請自己閱讀Winsock2.h。
2、將主機的unsigned long值轉換為網路位元組順序(32位):為什麼要這樣做呢?因為不同的電腦使用不同的位元組順序儲存資料。因此任何從Winsock函數對IP地址和連接埠號碼的引用和傳給Winsock函數的IP地址和連接埠號碼均時按照網路順序組織的。
u_long htonl(u_long hostlong); 舉例:htonl(0)=0 htonl(80)= 1342177280
3、將unsigned long數從網路位元組順序轉換位主機位元組順序,是上面函數的逆函數。
u_long ntohl(u_long netlong); 舉例:ntohl(0)=0 ntohl(1342177280)= 80
4、將主機的unsigned short值轉換為網路位元組順序(16位):原因同2:
u_short htons(u_short hostshort); 舉例:htonl(0)=0 htonl(80)= 20480
5、將unsigned short數從網路位元組順序轉換位主機位元組順序,是上面函數的逆函數。
u_short ntohs(u_short netshort); 舉例:ntohs(0)=0 ntohsl(20480)= 80
6、將用點分割的IP地址轉換位一個in_addr結構的地址,這個結構的定義見筆記(一),實際上就是一個unsigned long值。電腦內部處理IP地址可是不認識如192.1.8.84之類的資料。
unsigned long inet_addr( const char FAR * cp ); 舉例:inet_addr("192.1.8.84")=1409810880 inet_addr("127.0.0.1")= 16777343
如果發生錯誤,函數返回INADDR_NONE值。
7、將網路位址轉譯位用點分割的IP地址,是上面函數的逆函數。
char FAR * inet_ntoa( struct in_addr in ); 舉例:char * ipaddr=NULL; char addr[20]; in_addr inaddr; inaddr. s_addr=16777343; ipaddr= inet_ntoa(inaddr); strcpy(addr,ipaddr);
這樣addr的值就變為127.0.0.1。
注意意不要修改傳回值或者進行釋放動作。如果函數失敗就會返回NULL值。
8、擷取通訊端的本地地址結構:
int getsockname(SOCKET s, struct sockaddr FAR * name, int FAR * namelen ); s為通訊端 name為函數調用後獲得的地址值 namelen為緩衝區的大小。
9、擷取與通訊端相連的端地址結構:
int getpeername(SOCKET s, struct sockaddr FAR * name, int FAR * namelen ); s為通訊端 name為函數調用後獲得的端地址值 namelen為緩衝區的大小。
10、擷取電腦名稱:
int gethostname( char FAR * name, int namelen ); name是存放電腦名稱的緩衝區 namelen是緩衝區的大小 用法: char szName[255]; memset(szName,0,255); if(gethostname(szName,255)==SOCKET_ERROR) { //錯誤處理 } 傳回值為:szNmae="xiaojin"
11、根據電腦名稱擷取主機地址:
struct hostent FAR * gethostbyname( const char FAR * name ); name為電腦名稱。 用法: hostent * host; char* ip; host= gethostbyname("xiaojin"); if(host->h_addr_list[0]) { struct in_addr addr; memmove(&addr, host->h_addr_list[0],4); //獲得標準IP地址 ip=inet_ ntoa (addr); } 傳回值為:hostent->h_name="xiaojin" hostent->h_addrtype=2 //AF_INET hostent->length=4 ip="127.0.0.1"