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