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)= 13421772803、將unsigned long數從網絡字節順序轉換位主機字節順序,是上面函數的逆函數。
u_long ntohl(u_long netlong); 舉例:ntohl(0)=0 ntohl(1342177280)= 804、將主機的unsigned short值轉換爲網絡字節順序(16位):原因同2:
u_short htons(u_short hostshort); 舉例:htonl(0)=0 htonl(80)= 204805、將unsigned short數從網絡字節順序轉換位主機字節順序,是上面函數的逆函數。
u_short ntohs(u_short netshort); 舉例:ntohs(0)=0 ntohsl(20480)= 806、將用點分割的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"