RealICQSocket.pas 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. {
  2. 文件名:RealICQSocket.pas
  3. 功 能:此单元定义了一些Winsock应用的基本(公用)过程,函数和类型。
  4. 建 立:尹进
  5. 历 史:
  6. 2005.12.23:补文件说明信息(尹进)
  7. }
  8. unit RealICQSocket;
  9. interface
  10. uses
  11. WinSock2,
  12. SysUtils;
  13. type
  14. //Socket异常类
  15. TSocketException = class(Exception);
  16. //IP地址类型
  17. TIPVersion = (ipV4 = 0, ipV6 = 1);
  18. //初始化WinSock2
  19. procedure InitWinSock2;
  20. //释放已分配的WinSock2资源
  21. procedure FreeWinSock2;
  22. function HostToIP(Name: string; var Ip: string): Boolean;
  23. function GetHostIP(HostName: String): String;
  24. function GetLocalIP: String;
  25. implementation
  26. //------------------------------------------------------------------------------
  27. procedure InitWinSock2;
  28. var
  29. aWSAData: TWSAData;
  30. begin
  31. if WSAStartup($202, aWSAData) <> 0 then
  32. begin
  33. raise TSocketException.Create('初始化WinSock2失败,请确认系统是否正确安装了WinSock2');
  34. end;
  35. end;
  36. //------------------------------------------------------------------------------
  37. procedure FreeWinSock2;
  38. begin
  39. if WSACleanup() <> 0 then
  40. begin
  41. raise TSocketException.Create('清除WinSock2资源失败,错误代码:' + IntToStr( WSAGetLastError() ) );
  42. end;
  43. end;
  44. //------------------------------------------------------------------------------
  45. {域名解析}
  46. function HostToIP(Name: string; var Ip: string): Boolean;
  47. var
  48. hostName : array [0..255] of char;
  49. hostEnt : PHostEnt;
  50. addr : PChar;
  51. begin
  52. gethostname (hostName, sizeof (hostName));
  53. StrPCopy(hostName, Name);
  54. hostEnt := gethostbyname (hostName);
  55. if Assigned (hostEnt) then
  56. if Assigned (hostEnt^.h_addr_list) then begin
  57. addr := hostEnt^.h_addr_list^;
  58. if Assigned (addr) then begin
  59. IP := Format ('%d.%d.%d.%d', [byte (addr [0]),
  60. byte (addr [1]), byte (addr [2]), byte (addr [3])]);
  61. Result := True;
  62. end
  63. else
  64. Result := False;
  65. end
  66. else
  67. Result := False
  68. else begin
  69. Result := False;
  70. end;
  71. end;
  72. //------------------------------------------------------------------------------
  73. {获取IP地址}
  74. function GetHostIP(HostName: String): String;
  75. var
  76. buf:pChar;
  77. hostent:PHostEnt;
  78. begin
  79. Result := '';
  80. buf := Allocmem(60);
  81. strcopy(buf,PChar(HostName));
  82. if Trim(buf)='' then
  83. gethostname(buf,60);
  84. hostent := gethostbyname(buf);
  85. Freemem(buf,60);
  86. if hostent=nil then
  87. Exit;
  88. Result := inet_ntoa(pinAddr(hostent^.h_addr^)^);
  89. end;
  90. //获取本机所有IP地址,IP地址之间用“,”隔开
  91. function GetLocalIP: String;
  92. type
  93. TaPInAddr = Array[0..10] of PInAddr;
  94. PaPInAddr = ^TaPInAddr;
  95. var
  96. phe: PHostEnt;
  97. pptr: PaPInAddr;
  98. Buffer: Array[0..63] of Char;
  99. I: Integer;
  100. IP: String;
  101. begin
  102. IP:='';
  103. GetHostName(Buffer, SizeOf(Buffer));
  104. phe := GetHostByName(buffer);
  105. if phe = nil then
  106. begin
  107. Result:=IP;
  108. exit;
  109. end;
  110. pPtr := PaPInAddr(phe^.h_addr_list);
  111. I := 0;
  112. while pPtr^[I] <> nil do
  113. begin
  114. if IP = '' then
  115. IP := inet_ntoa(pptr^[I]^)
  116. else
  117. IP := IP + ',' + inet_ntoa(pptr^[I]^);
  118. Inc(I);
  119. end;
  120. Result:=IP;
  121. end;
  122. initialization
  123. InitWinSock2;
  124. finalization
  125. FreeWinSock2;
  126. end.