function GetLocalIP(var LocalIp: string): Boolean; var HostEnt: PHostEnt; Ip: string; addr: pchar; Buffer: array [0..63] of char; GInitData: TWSADATA; begin Result := False; try WSAStartup(2, GInitData); GetHostName(Buffer, SizeOf(Buffer)); HostEnt := GetHostByName(buffer); if HostEnt = nil then Exit; addr := HostEnt^.h_addr_list^; ip := Format('%d.%d.%d.%d', [byte(addr [0]), byte (addr [1]), byte (addr [2]), byte (addr [3])]); LocalIp := Ip; Result := True; finally WSACleanup; end; end;
WSAStartup使用详解
摘要:首先说明WinSock编程中加载套接字库的一些基本内容,然后详细讲解了WSAStartup函数、WSACleanup函数、WSAData结构体的使用。最后给出示例代码说明套接字库的加载和版本协商。上面的代码是调用Winsock2.2版本。版本1.1是Winsock.h和wsock32.lib。
WSAStartup int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData );
说明:如果在参数wVersionRequested中指定的Socket版本高于DLL中支持的最低版本,函数将调用成功。在参数lpWSAData指向的WSADATA变量中的wVersion成员保存了将要使用的版本号。所以一般的程序都要检查使用的版本号是否为要求的版本号(关于版本协商的更多内容见参考文献【2】)。常用的版本号1.1和2.2
struct WSAData{ WORD wVersion; //winsockdll期望调用者使用的版本 WORD wHighVersion; //winsockdll支持的最高版本号 char szDescription[WSADESCRIPTION_LEN+1]; //描述字符串 char szSystemStatus[WSASYSSTATUS_LEN+1]; //系统配置信息 unsignedshort iMaxSockets; //winsoc1.1中单个进程能够创建最大socket数,2.0后 //的版本没有用 unsignedshort iMaxUdpDg; //2.0后的版本没有用 charFAR* lpVendorInfo;//2.0后的版本没有用 };
//参数mainVersion是套接字库的主板号 //参数subVersion 是套接字库的副版号 bool InitSocketLib(BYTE mainVersion,BYTE subVersion) { WORD requestedVersion=MAKEWORD(subVersion,mainVersion); WSADATA wsaData; int err=WSAStartup(requestedVersion,&wsaData); if(0!=err){ //加载套接字失败 return false; } //进行版本协商,是否加载到需要的套接字版本库 if(LOBYTE(wsaData.wVersion)!=mainVersion|| HIBYTE(wsaData.wVersion)!=subVersion){ WSACleanup(); return false; } return true; }
MAKEWORD WORD MAKEWORD( BYTEbLow, //low-orderbyteofshortvalue BYTEbHigh //high-orderbyteofshortvalue ); 注意MAKEWORD是带参数的宏,不是函数。bLow是低位字节,bHigh是高位字节。 宏最后得到的结果是一个WORD类型的数值。
【2】WinSock编程中的版本协商 hi.baidu.com/hphouylesmbceod/item/f8fe8b3c2aefffbdc2cf29a1
gethostname()
#include <Winsock2.h> int PASCAL FAR gethostname(char FAR *name, int namelen); name: 一个指向将要存放主机名的缓冲区指针。 namelen:缓冲区的长度。返回本地主机的标准主机名。
原文地址:http://blog.csdn.net/liuganggao/article/details/44014649