📄 netfun.~pas
字号:
{*******************************************************}
{ }
{ 1. 有关网络名称与IP地址解析 }
{ 2. 有关TCP、UDP通讯 }
{ }
{ 傅 洪 }
{ Copyright (c) 2001,02 YuanShan Corporation }
{ }
{*******************************************************}
unit NetFun;
interface
uses Winsock,Sysutils, Classes;
function HostToIP(Name: string; var Ip: string): Boolean;
function IPAddrToName(IPAddr : String): String;
function GetMyHostIP(var IP:string; var ErrMsg:string):Boolean;
function GetMyHostName:string;
function IsHostNoline(Name:string):Boolean;
implementation
function GetMyHostName:string;
var
p:PChar;
TmpStr:string;
wsdata:TWSAData;
begin
Result := '';
p := AllocMem(100);
try
IF WSAstartup(2,wsdata)=0 THEN
if getHostName(p,80)=0 THEN
begin
TmpStr := p;
Result := TmpStr;
end;
finally
FreeMem(p,100);
end;
end;
function GetMyHostIP(var IP:string; var ErrMsg:string):Boolean;
VAR
ch : ARRAY[1..32] OF Char;
i : Integer;
WSData: TWSAData;
MyHost: PHostEnt;
begin
IP := '';
ErrMsg := '';
IF WSAstartup(2,wsdata)<>0 THEN
BEGIN
ErrMsg := 'can''t start Winsock: Error ';
ErrMsg := ErrMsg + IntToStr(WSAGetLastError);
IP := '';
Result := False;
exit;
END;
try
IF getHostName(@ch[1],32)<>0 THEN
BEGIN
ErrMsg := 'getHostName failed';
Result := False;
exit;
END;
except
ErrMsg := 'getHostName failed';
Result := False;
exit;
end;
MyHost:=GetHostByName(@ch[1]);
IF MyHost=NIL THEN
BEGIN
ErrMsg := 'GetHostByName failed';
Result := False;
exit;
END
ELSE
BEGIN
FOR i:=1 TO 4 DO
BEGIN
IP := IP + IntToStr(Ord(MyHost.h_addr^[i-1]));
IF i<4 THEN IP := IP + '.';
END;
Result := True;
END;
end;
function IsHostNoline(Name:string):Boolean;
var
wsdata : TWSAData;
hostName : array [0..255] of char;
hostEnt : PHostEnt;
begin
Result := False;
WSAStartup ($0101, wsdata);
try
//gethostname (hostName, sizeof (hostName));
FillChar(hostName[0],256,$0);
StrPCopy(hostName, Name);
hostEnt := gethostbyname (hostName);
if Assigned (hostEnt) then Result := True;
finally
WSACleanup;
end;
end;
function HostToIP(Name: string; var Ip: string): Boolean;
var
wsdata : TWSAData;
hostName : array [0..255] of char;
hostEnt : PHostEnt;
addr : PChar;
begin
WSAStartup ($0101, wsdata);
try
gethostname (hostName, sizeof (hostName));
StrPCopy(hostName, Name);
hostEnt := gethostbyname (hostName);
if Assigned (hostEnt) then
if Assigned (hostEnt^.h_addr_list) then begin
addr := hostEnt^.h_addr_list^;
if Assigned (addr) then begin
IP := Format ('%d.%d.%d.%d', [byte (addr [0]),
byte (addr [1]), byte (addr [2]), byte (addr [3])]);
Result := True;
end
else
Result := False;
end
else
Result := False
else begin
Result := False;
end;
finally
WSACleanup;
end;
end;
function IPAddrToName(IPAddr : String): String;
var
SockAddrIn: TSockAddrIn;
HostEnt: PHostEnt;
WSAData: TWSAData;
begin
WSAStartup($101, WSAData);
SockAddrIn.sin_addr.s_addr:= inet_addr(PChar(IPAddr));
HostEnt:= gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);
if HostEnt<>nil then
begin
result:=StrPas(Hostent^.h_name)
end
else
begin
result:='';
end;
end;
function UDPSend(NMUDP1: TNMUDP; const sSend: string; const iLen: integer):integer;
var
MyStream: TMemoryStream;
TmpStr: String;
Begin
Result := 0;
TmpStr := sSend;
MyStream := TMemoryStream.Create;
try
MyStream.Write(TmpStr[1], iLen);
NMUDP1.SendStream(MyStream);
finally
MyStream.Free;
end;
end;
function UDPRecv(NMUDP1: TNMUDP; var sRecv: string; const NumberBytes: integer):integer;
var
MyStream: TMemoryStream;
TmpStr: String;
begin
Result := 0;
MyStream := TMemoryStream.Create;
try
NMUDP1.ReadStream(MyStream);
SetLength(TmpStr,NumberBytes);
MyStream.Read(TmpStr[1],NumberBytes);
finally
MyStream.Free;
end;
sRecv := TmpStr;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -