您现在的位置是: 首页 > 重装系统 重装系统
_winsock控件 CAN
tamoadmin 2024-08-24 人已围观
简介1.DELPHI上简单高效的SOCKET控件怎么选择2.delphi如何能判断网络通不通?3.中翻英翻译在线等4.绝对高分求客户端向服务器上传与下载文件的程序5.VB如何去判断某个IP是否能ping通?回答你那肯定是完全可以实现的啦,就利用vb自带的winsock控件即可搞定你所需的功能,你好好研究研究winsock控件的详细解析吧。这里给你一个超级简单的控制B电脑的最初A电脑端的说明看看吧,上面
1.DELPHI上简单高效的SOCKET控件怎么选择
2.delphi如何能判断网络通不通?
3.中翻英翻译在线等
4.绝对高分求客户端向服务器上传与下载文件的程序
5.VB如何去判断某个IP是否能ping通?
回答你那肯定是完全可以实现的啦,就利用vb自带的winsock控件即可搞定你所需的功能,你好好研究研究winsock控件的详细解析吧。
这里给你一个超级简单的控制B电脑的最初A电脑端的说明看看吧,上面的按钮按下去后、B电脑就会执行按钮上说明的功能,如A电脑按下“打开光驱”的按钮、B电脑的vb程序就去执行打开本机光驱的功能;如A电脑按下“关闭计算机”的按钮、B电脑的vb程序就去执行“关机”的功能了。
这个解释的目的就是:告诉你仔细研究winsock控件详细资料(资料网上密密麻麻),你一定会有极大的收获。如果你不相信而需要感觉一下可以到我的下面地址的留言薄留言找我或在百度中找我。
DELPHI上简单高效的SOCKET控件怎么选择
(利用系统的ipconfig命令重定向到临时文件,vb读取文件处理下就ok了
其他方法一般都要调用系统API了)
画个按钮,画个Timer,画个文本框
timer的Enabled属性设置成false,interval属性设置成1000
然后复制下面代码就可以了
timer纯粹是为了延时,等待临时文件生成的一个很拙劣的办法,如果你用别的方法实现shell同步执行,如用WaitforSingleObject等API函数之类的就不用Timer了,Timer里边的东西都写到按钮好了
'按钮点击
Private Sub Command1_Click()
Shell "cmd /c ipconfig.exe > " & Environ("temp") & "\ip.txt"
Timer1.Enabled = True
End Sub
'Timer的Timer
Private Sub Timer1_Timer()
Dim i As Long, a As String, isFind As Boolean
Open Environ("temp") & "\ip.txt" For Input As #1
Do While Not EOF(1)
Line Input #1, a
If InStr(a, "PPP adapter") > 0 Then
isFind = True
Exit Do
End If
Loop
If isFind Then
For i = 1 To 10
Line Input #1, a
If InStr(a, "IP Address") > 0 Then
Text1.Text = Trim(Mid(a, InStr(a, ":") + 1))
Exit For
End If
Next i
End If
Close #1
Timer1.Enabled = False
End Sub
=================无敌的分割线================================
关于问题补充
Winsock控件是没办法做到的,可以使用WSOCK32.DLL中提供的API实现
你可以测试下,复制以下代码,窗口上画个按钮就成,理论上来说,最后一个IP地址就是你的宽带IP地址,代码来源于互联网
Private Const WS_VERSION_REQD = &H101
Private Const WS_VERSION_MAJOR = WS_VERSION_REQD \ &H100 And &HFF&
Private Const WS_VERSION_MINOR = WS_VERSION_REQD And &HFF&
Private Const MIN_SOCKETS_REQD = 1
Private Const SOCKET_ERROR = -1
Private Const WSADescription_Len = 256
Private Const WSASYS_Status_Len = 128
Private Type HOSTENT
hName As Long
hAliases As Long
hAddrType As Integer
hLength As Integer
hAddrList As Long
End Type
Private Type WSADATA
wversion As Integer
wHighVersion As Integer
szDescription(0 To WSADescription_Len) As Byte
szSystemStatus(0 To WSASYS_Status_Len) As Byte
iMaxSockets As Integer
iMaxUdpDg As Integer
lpszVendorInfo As Long
End Type
Private Declare Function WSetLastError Lib "WSOCK32.DLL" () As Long
Private Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal _
wVersionRequired&, lpWSAData As WSADATA) As Long
Private Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long
Private Declare Function gethostname Lib "WSOCK32.DLL" (ByVal hostname$, ByVal HostLen As Long) As Long
Private Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal _
hostname$) As Long
Private Declare Sub RtlMoveMemory Lib "KERNEL32" (hpvDest As Any, ByVal hpvSource&, ByVal cbCopy&)
Function hibyte(ByVal wParam As Integer)
hibyte = wParam \ &H100 And &HFF&
End Function
Function lobyte(ByVal wParam As Integer)
lobyte = wParam And &HFF&
End Function
Sub SocketsInitialize()
Dim WSAD As WSADATA
Dim iReturn As Integer
Dim sLowByte As String, sHighByte As String, sMsg As String
iReturn = WSAStartup(WS_VERSION_REQD, WSAD)
If iReturn <> 0 Then
MsgBox "Winsock.dll is not responding."
End
End If
If lobyte(WSAD.wversion) < WS_VERSION_MAJOR Or (lobyte(WSAD.wversion) = _
WS_VERSION_MAJOR And hibyte(WSAD.wversion) < WS_VERSION_MINOR) Then
sHighByte = Trim$(Str$(hibyte(WSAD.wversion)))
sLowByte = Trim$(Str$(lobyte(WSAD.wversion)))
sMsg = "Windows Sockets version " & sLowByte & "." & sHighByte
sMsg = sMsg & " is not supported by winsock.dll "
MsgBox sMsg
End
End If
'iMaxSockets is not used in winsock 2. So the following check is only
'necessary for winsock 1. If winsock 2 is requested,
'the following check can be skipped.
If WSAD.iMaxSockets < MIN_SOCKETS_REQD Then
sMsg = "This lication requires a minimum of "
sMsg = sMsg & Trim$(Str$(MIN_SOCKETS_REQD)) & " supported sockets."
MsgBox sMsg
End
End If
End Sub
Sub SocketsCleanup()
Dim lReturn As Long
lReturn = WSACleanup()
If lReturn <> 0 Then
MsgBox "Socket error " & Trim$(Str$(lReturn)) & " occurred in Cleanup "
End
End If
End Sub
Sub Form_Load()
SocketsInitialize
End Sub
Private Sub Form_Unload(Cancel As Integer)
SocketsCleanup
End Sub
Private Sub Command1_click()
Dim hostname As String * 256
Dim hostent_addr As Long
Dim host As HOSTENT
Dim hostip_addr As Long
Dim temp_ip_address() As Byte
Dim i As Integer
Dim ip_address As String
If gethostname(hostname, 256) = SOCKET_ERROR Then
MsgBox "Windows Sockets error " & Str(WSetLastError())
Exit Sub
Else
hostname = Trim$(hostname)
End If
hostent_addr = gethostbyname(hostname)
If hostent_addr = 0 Then
MsgBox "Winsock.dll is not responding."
Exit Sub
End If
RtlMoveMemory host, hostent_addr, LenB(host)
RtlMoveMemory hostip_addr, host.hAddrList, 4
MsgBox hostname
'get all of the IP address if machine is multi-homed
Do
ReDim temp_ip_address(1 To host.hLength)
RtlMoveMemory temp_ip_address(1), hostip_addr, host.hLength
For i = 1 To host.hLength
ip_address = ip_address & temp_ip_address(i) & "."
Next
ip_address = Mid$(ip_address, 1, Len(ip_address) - 1)
MsgBox ip_address
ip_address = ""
host.hAddrList = host.hAddrList + LenB(host.hAddrList)
RtlMoveMemory hostip_addr, host.hAddrList, 4
Loop While (hostip_addr <> 0)
End Sub
delphi如何能判断网络通不通?
主要用异步通讯方式
直接api,winsock?
参考之:
Delphi(Pascal) code下面是一个简单的Socket通信程序,其中客户机和服务机是同一个程序,当客户机(服务器)在一个memo1中输入一段文字然后敲入回车,该段文字就可以显示在服务器(客户机)的memo2中,反之亦成立。具体步骤如下:1、新建一个form,任意命名,不妨设之为chatForm;放上一个MainMenu(在Standard栏中),建立ListenItem、ConnectItem、Disconnect和Exit菜单项;在从Internet栏中选择TServerSocket、TClientSocket添加到chatForm中,其中把TClientSocket的名字设为ClientSocket, port设为1025,默认的active为false;把TServerSocket的名字设为ServerSocket,port设为1025,默认的active为false,其他的不变;再放入两个memo,一个命名为memo1,另外一个命名为memo2,其中把memo2的color设置为灰色,因为主要用来显示对方的输入。下面我们一边编写代码一边解? 因。
2、双击ListemItem。写入如下代码:
procedure TChatForm.ListenItemClick(Sender: TObject);
begin
ListenItem.Checked := not ListenItem.Checked;
if ListenItem.Checked then
begin
ClientSocket.Active := False;
ServerSocket.Active := True;
end
else
begin
if ServerSocket.Active then
ServerSocket.Active := False;
end;
end;
该程序段的说明如下:当用户选择ListemItem时,该ListenItem取反,如果选中的话,说明处于Listen状态,读者要了解的是:listen是Socket作为Server时一个专有的方法,如果处于listen,则ServerSocket设置为活动状态;否则,取消listen,则关闭ServerSocket。实际上,只有用户一开始选择该菜单项,表明该程序用作Server。反之,如果用户选择ConnectItem,则必然作为Client使用。
3、双击ConnectItem,敲入以下代码。
procedure TChatForm.ConnectItemClick(Sender: TObject);
begin
if ClientSocket.Active then ClientSocket.Active := False;
if InputQuery(Computer to connect to, Address Name:, Server) then
if Length(Server) $#@62; 0 then
with ClientSocket do
begin
Host := Server;
Active := True;
ListenItem.Checked := False;
end;
end;
这段程序的主要功能就是当用户选择ConnectItem菜单项时,设置应用程序为客户机,弹出input框,让用户输入服务器的地址。这也就是我们不一开始固定ClientSocket的host的原因,这样用户可以动态地连接不同的服务器。读者需要了解的是主机地址只是Socket作为客户机时具有的一个属性,Socket作为服务器时“一般“不用地址,因为它同本机绑定。
4、在memo1的keydown方法中写入如下代码:
procedure TChatForm.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_Return then
if IsServer then
ServerSocket.Socket.Connections[0].SendText(Memo1.Lines[Memo1.Lines.Count - 1])
else
ClientSocket.Socket.SendText(Memo1.Lines[Memo1.Lines.Count - 1]);
end;
该段代码的作用很明显,就是开始发消息了。其中如果是Server的话,它只向第一个客户机发消息,由于一个服务器可以连接多个客户机,而同客户机的每一个连接都由一个Socket来维持,因此ServerSocket.Socket.Connnections数组中存储的就是同Client维持连接的Socket。在标准Socket中,服务器方的Socket通过accept()方法的返回值获取维持同客户机连接的Socket,而发送、接受消息的方法分别为send(sendto)和recv(recvfrom), Delphi对此进行了封装。
5、其余代码的简要介绍。
procedure TChatForm.ServerSocketAccept(Sender: TObject;
Socket: TCustomWinSocket);
begin
IsServer := True;
end;
ServerSocket的Accept方法,当客户机第一次连接时完成,通过其参数可以认为,它是在标准的accept方法后执行的,因为有TCustomWinSocket这个参数类型,它应该是标准Server方Socket的返回值。
procedure TChatForm.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo2.Lines.Add(Socket.ReceiveText);
end;
procedure TChatForm.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo2.Lines.Add(Socket.ReceiveText);
end;
这两段代码分别是服务器方和客户机方在收到对方的消息时,由Delphi触发的,作用是在memo2中显示收到的消息。其中,ClientSocketRead中的Socket实际上就是Socket本身,而在ServerSocketClientRead中的Socket实际上是ServerSocket.Socket.Connection[]中的某个Socket。不过在Delphi中,对服务器方的Socket进行了有效的封装。
procedure TChatForm.ServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo2.Lines.Clear;
end;
procedure TChatForm.ClientSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
ListenItemClick(nil);
end;
这两段比较简单。其中ServerSocketClientConnect在ServerSocket收到一个新的连接时触发。而ClientSocketDisconnect在ClientSocket发出Disconncet时触发。
procedure TChatForm.Exit1Click(Sender: TObject);
begin
ServerSocket.Close;
ClientSocket.Close;
Close;
end;
procedure TChatForm.Disconnect1Click(Sender: TObject);
begin
ClientSocket.Active := False;
ServerSocket.Active := True;
end;
第一段为关闭应用程序。在标准Socket中,每个Socket在关闭时,必须调用closesocket()方法,否则系统不会释放。而在ServerSockt.Close和ClientSocket.Close中,系统内部肯定调用了closesocket()方法。
三、标准Socket与Delphi中的Socket。
标准的Socket的应用程序框架如下:
Server方: Socket()[ 新建一个Socket]--Bind()[ 同服务器地址邦定 ]--Listen() --Accept()--block wait--read()[接受消息,在windows平台中,方法为send(TCP),或者是sendto(UDP)]--处理服务请求--Write()[发送消息,在windows平台中,方法为send(TCP), 或者为sendto(UDP)。
Client方相对简单:Socket()--Connect()[通过一定的port连接特定的服务器,这是与服务器建立连接]--Write()--Read()。
Socket可以是基于TCP的,也可以是基于UDP,同时Socket甚至建立在其他的协议,比如IPX/SPX,DECNet等。在新建一个Socket时,可以指定新建何类Socket。Bind()用来同服务器的地址邦定,如果一个主机只有一个IP地址,实际上邦定的作用就相对多余了。Listen()开始监听网络,Accept()用于接受连接,其返回值是保持同客户机联系的Socket。
在Delphi中,对于Windows中的Socket进行了有效的封装。在Delphi中,按其继承关系,可以分层两类:
一、TComponent--TAbstractSocket--TCustomSocket--TCustomServerSocket--TServerSocket
TComponent--TAbstractSocket--TCustomSocket--TClientSocket
二、直接从TObject继承过来:
TObject--TCustomWinSocket--TServerWinSocket
TObject--TCustomWinSocket--TClientWinSocket
TObject--TCustomWinSocket--TServerClientWinSocket
可以看出第一类建立在TCustomSocket基础上,第二类建立在TCustomWinSocket的基础上。第一类建立在TComponet的基础上,第二类直接构建在TObject基础上。因此如果用户非常熟悉Socket并且想要编写控制台程序时,可以使用TCustomWinScoket类。
同uses中可以看出,它们都在ScktComp.pas中实现,而在schtComp.pas中,则包含了winsock.pas文件,如果继续深入winsock文件,在其中可以发现所有的Windows Socket的基本方法。
实际上,如果你了解了标准Socket的应用程序框架,对于使用Delphi编写Socket应用程序也就得心应手了;这不是说你必须了解复杂的Socket中的标准函数,也没有必要,因为Delphi已经为你做了很好的封装了,这也正是Delphi的强势所在,你只要了解那么一点点的基本框架。
这是我对Delphi中的Socket应用的理解,不足之处希望大家指正。同时也乐于为大家解答Delphi中有关Socket的问题。
SOCKET控件与直接使用API相比
Windows自带的Tracert是向远程主机发送ICMP包进行追踪,但是目前很多主机关闭了ICMP答复,这个工具不太好使了~~~~~原理咱知道,正规的Trace不就是发送TTL依次递增的UDP包吗?什么网关和路由敢随意丢弃我们的UDP包而不通知我们?ICMP包你可以不理,但是UDP包~~~~~不怕黑你?
unit YRecords;
interface
uses
Windows;
const
PACKET_SIZE = 32;
MAX_PACKET_SIZE = 512;
TRACE_PORT = 34567;
LOCAL_PORT = 5555;
type
s32 = Integer;
u32 = DWORD;
u8 = Byte;
u16 = word; PU16 = ^U16;
//
//IP Packet Header
//
PIPHeader = ^YIPHeader;
YIPHeader = record
u8verlen : u8;//4bits ver, 4bits len, len*4=true length
u8tos : u8;//type of service, 3bits 优先权(现在已经被忽略), 4bits TOS, 最多只能有1bit为1
u16totallen : u16;//整个IP数据报的长度,以字节为单位。
u16id : u16;//标识主机发送的每一份数据报。
u16offset : u16;//3bits 标志,13bits片偏移
u8ttl : u8;//生存时间字段设置了数据报可以经过的最多路由器数。
u8protol : u8;//协议类型,6表示传输层是TCP协议。
u16checksum : u16;//首部检验和。
u32srcaddr : u32;//源IP地址,不是‘xxx.xxx.xxx.xxx’的形势哦
u32destaddr : u32;//目的IP地址,同上
end;
//
//ICMP Packet Header
//
PICMPHeader = ^YICMPHeader;
YICMPHeader = record
u8type : u8;
u8code : u8;
u16chksum : u16;
u16id : u16;
u16seq : u16;
end;
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, YRecords, winsock2;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Edit1: TEdit;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function DecodeIcmpReply( pbuf: PChar; var seq: s32 ): string;
var
pIpHdr : PChar;
pIcmphdr : PICMPHeader;
sip : string;
ttl : integer;
begin
pIpHdr := pbuf;
sip := inet_ntoa( TInAddr( PIPHeader(pIpHdr)^.u32srcaddr ) );
ttl := PIPHeader(pIpHdr)^.u8ttl;
Inc( pIpHdr, (PIPHeader(pIpHdr)^.u8verlen and $0F) * 4 );
pIcmpHdr := PICMPHeader(pIpHdr);
result := ;
if pIcmpHdr^.u8type = 3 then //目的不可达信息,Trace完成
seq := 0;
if pIcmpHdr^.u8type = 11 then //超时信息,正在Trace
result := Format( %4d%32s%8d, [seq, sip, ttl] );
end;
procedure ErrMsg( msg: string );
begin
MessageBox( 0, PChar(msg), Ping Program Error, MB_ICONERROR );
end;
procedure TForm1.FormCreate(Sender: TObject);
var
wsa : TWSAData;
begin
if WSAStartup( $0202, wsa ) <> 0 then
ErrMsg( Windows socket is not responed. );
ListBox1.Font.Name := Courier New;
ListBox1.Font.Size := 9;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if WSACleanup <> 0 then
ErrMsg( Windows socket can not be closed. );
end;
procedure TForm1.Button1Click(Sender: TObject);
const
SIO_RCVALL = IOC_IN or IOC_VENDOR or 1;
var
rawsock : TSocket;
pRecvBuf : PChar;
FromAdr : TSockAddr;
FromLen : s32;
fd_read : TFDSet;
timev : TTimeVal;
sReply : string;
udpsock : TSocket;
ret : s32;
DestAdr : TSockAddr;
pSendBuf : PChar;
ttl, opt : s32;
pHost : PHostEnt;
begin
//创建一个RAWSOCK接收回应ICMP包
rawsock := socket( AF_INET, SOCK_RAW, IPPROTO_ICMP );
FromAdr.sin_family := AF_INET;
FromAdr.sin_port := htons(0);
FromAdr.sin_addr.S_addr := inet_addr(192.168.1.12); //换成你的IP
//如果不bind就无法接收包了~~~因为下面还要创建一个UDPSOCK
bind( rawsock, @FromAdr, SizeOf(FromAdr) );
Opt := 1;
WSAIoctl( rawsock, SIO_RCVALL, @Opt, SizeOf(Opt), nil, 0, @ret, nil, nil );
//接收ICMP回应包的缓冲区
pRecvBuf := AllocMem( MAX_PACKET_SIZE );
//创建一个UDPSOCK发送探测包
udpsock := socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
//要发送的UDP数据
pSendBuf := AllocMem( PACKET_SIZE );
FillChar( pSendBuf^, PACKET_SIZE, C );
FillChar( DestAdr, sizeof(DestAdr), 0 );
DestAdr.sin_family := AF_INET;
DestAdr.sin_port := htons( TRACE_PORT );
DestAdr.sin_addr.S_addr := inet_addr( PChar(Edit1.Text) );
//如果edit1.text不是IP地址,则尝试解析域名
if DestAdr.sin_addr.S_addr = INADDR_NONE then
begin
pHost := gethostbyname( PChar(Edit1.Text) );
if pHost <> nil then
begin
move( pHost^.h_addr^^, DestAdr.sin_addr, pHost^.h_length );
DestAdr.sin_family := pHost^.h_addrtype;
DestAdr.sin_port := htons( TRACE_PORT );
ListBox1.Items.Add( Edit1.Text +IP地址->+ inet_ntoa(DestAdr.sin_addr) );
end else
begin
ListBox1.Items.Add( 解析域名: + Edit1.Text + 出错。 );
closesocket( rawsock );
closesocket(udpsock);
FreeMem( pSendBuf );
FreeMem( pRecvBuf );
exit;
end;
end;
ListBox1.Items.Add( Trace route + Edit1.Text + ...... );
Listbox1.Update;
//开始Trace!!!
ttl := 1;
while True do
begin
//设置TTL,使我们发送的UDP包的TTL依次累加
setsockopt( udpsock, IPPROTO_IP, IP_TTL, @ttl, sizeof(ttl) );
//发送UDP包到HOST
sendto( udpsock, pSendBuf^, PACKET_SIZE, 0, DestAdr, sizeof(DestAdr) );
FD_ZERO( fd_read );
FD_SET( rawsock, fd_read );
timev.tv_sec := 5;
timev.tv_usec := 0;
if select( 0, @fd_read, nil, nil, @timev ) < 1 then
break;
if FD_ISSET( rawsock, fd_read ) then
begin
FillChar( pRecvBuf^, MAX_PACKET_SIZE, 0 );
FillChar( FromAdr, sizeof(FromAdr), 0 );
FromAdr.sin_family := AF_INET;
FromLen := sizeof( FromAdr );
recvfrom( rawsock, pRecvBuf^, MAX_PACKET_SIZE, 0, FromAdr, FromLen );
sReply := DecodeIcmpReply( pRecvBuf, ttl );
if sReply <> then
begin
ListBox1.ItemIndex := ListBox1.Items.Add( sReply );
Listbox1.Update;
end;
if ttl = 0 then //如果收到目标主机的相应包,DecodeIcmpReply会把ttl==0
break;
end;
Inc( ttl );
Sleep( 110 );
end; //while not bStop do
ListBox1.Items.Add( 追踪路由完成。 );
ListBox1.Items.Add( );
closesocket( rawsock );
closesocket(udpsock);
FreeMem( pSendBuf );
FreeMem( pRecvBuf );
end;
end.
------解决方案--------------------
如果压力较大
感觉标准的不如indy
indy不如api?
------解决方案--------------------
upup...?
------解决方案--------------------
用INDY好点,API有点复杂?
------解决方案--------------------
ICS 用了都说好!?
------解决方案--------------------
1000以下的连接用INDY不错,1000以上考虑自己封装完成端口。?
------解决方案--------------------
所有VCL用FastMM检测都有哪个内存泄漏的提示,如果只有一个可以忽略,楼主看看源代码就知道了。?
------解决方案--------------------
简单高效就是serversocket和clientsocket
中翻英翻译在线等
给你个我自己用的函数吧。
//---------------
//公用函数
//引用操作系统SensApi.dll 判断当前的网络是否连接
function IsNetworkAlive(var lpdwFlagsLib:Integer):Integer;stdcall;external'SensApi.dll';
//ping网络
function fucPing(url: String): Boolean;
//获取当前网络的连接状态 add by jzh 2010-05-24
function fucIsNetworkAlive: Boolean;
const
NETWORK_ALIVE_LAN = 1; //通过局域网上网
const
NETWORK_ALIVE_WAN = 2; //通过广域网上网
var
falg: Integer;
bAlive: Boolean;
begin
try
bAlive:= False;
IsNetworkAlive(falg);
case falg of
NETWORK_ALIVE_LAN:
begin
bAlive:= True;
end;
NETWORK_ALIVE_WAN:
begin
bAlive:= True;
end;
end;
result:= bAlive;
except
result:= false;
end;
end;
//ping网络
function fucPing(url: String): Boolean;
var
aIdICMPClient: TIdICMPClient;
begin
aIdICMPClient:= TIdICMPClient.Create(nil);
aIdIcmpclient.ReceiveTimeout:=500;
aIdICMPClient.Host:= url;
try
aIdICMPClient.Ping();
except
Result:= false;
end;
if (aidicmpclient.ReplyStatus.fromipaddress<>'0.0.0.0')
and (aidicmpclient.ReplyStatus.fromipaddress<>'') then
result:= true
else
result:= false;
aIdICMPClient.Free;
end;
绝对高分求客户端向服务器上传与下载文件的程序
With the advances of modern society, information transmission and exchange of information more and more / \ their re-
As. In ancient times, pass through the flying magpie books, through war alarm, passing through the superior orders until the horse
Modern cable for quick and accurate transmission of information, to the contemporary use of telephone, Email, computers, fax
And so on, which people love to use the chat tool is the QQ chat tool ailable online chat
Days, transfer files or pictures, voice, convenient for people to emotional communication, business negotiation, multi-Council
Meeting, you can stay at home can also bring their own day.
Since there are so many benefits QQ tool, it is how to achieve it? The purpose of this design
Is in Vb programming platform, use the Winsock control to achieve client and server-side communication.
The design enables single person chat, chat, and many people add friends, and realize the QQ tools
Basic functions.
Key words Single chat; people chat; Add Friends
VB如何去判断某个IP是否能ping通?
==========上传部分================
一 WEB部分
1 首先把WEB页获得本地要上传的文件名
2 WEB通过脚本把本地文件名(绝对路径)给客户端组件
3 WEB脚本控制组件开始传送数据
4 最后判断是否传输成功
二 组件部分
1 建立INTERNET连接
2 连接FTP服务器
3 获得本地文件名(绝对路径)
4 返回远程即将保存的文件名
5 传送数据
6 判断是否传输成功,返回状态
WEB页获取本地文件
组件返回远程文件名
组件传送数据
返回
本例在VB6.0 +WIN2000+ IIS5.0 + SERV-U 5.0 下调试成功
VB部分
一、建立一个ActiveX DLL工程
二、更改工程名FtpConn
三、更改类名:clsPutFile
四、加入一个空模块到工程中,此模块主要对需要使用的函数进行声明,在此不多做解释,代码如下:
Option Explicit
Declare Function GetProcessHeap Lib "kernel32" () As Long
Declare Function HeapAlloc Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
Declare Function HeapFree Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As Long
Public Const HEAP_ZERO_MEMORY = &H8
Public Const HEAP_GENERATE_EXCEPTIONS = &H4
Declare Sub CopyMemory1 Lib "kernel32" Alias "RtlMoveMemory" ( _
hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)
Declare Sub CopyMemory2 Lib "kernel32" Alias "RtlMoveMemory" ( _
hpvDest As Long, hpvSource As Any, ByVal cbCopy As Long)
Public Const MAX_PATH = 260
Public Const NO_ERROR = 0
Public Const FILE_ATTRIBUTE_READONLY = &H1
Public Const FILE_ATTRIBUTE_HIDDEN = &H2
Public Const FILE_ATTRIBUTE_SYSTEM = &H4
Public Const FILE_ATTRIBUTE_DIRECTORY = &H10
Public Const FILE_ATTRIBUTE_ARCHIVE = &H20
Public Const FILE_ATTRIBUTE_NORMAL = &H80
Public Const FILE_ATTRIBUTE_TEMPORARY = &H100
Public Const FILE_ATTRIBUTE_COMPRESSED = &H800
Public Const FILE_ATTRIBUTE_OFFLINE = &H1000
Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type
Public Const ERROR_NO_MORE_FILES = 18
Public Declare Function InternetFindNextFile Lib "wininet.dll" Alias "InternetFindNextFileA" _
(ByVal hFind As Long, lpvFindData As WIN32_FIND_DATA) As Long
Public Declare Function FtpFindFirstFile Lib "wininet.dll" Alias "FtpFindFirstFileA" _
(ByVal hFtpSession As Long, ByVal lpszSearchFile As String, _
lpFindFileData As WIN32_FIND_DATA, ByVal dwFlags As Long, ByVal dwContent As Long) As Long
Public Declare Function FtpGetFile Lib "wininet.dll" Alias "FtpGetFileA" _
(ByVal hFtpSession As Long, ByVal lpszRemoteFile As String, _
ByVal lpszNewFile As String, ByVal fFailIfExists As Boolean, ByVal dwFlagsAndAttributes As Long, _
ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean
Public Declare Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" _
(ByVal hFtpSession As Long, ByVal lpszLocalFile As String, _
ByVal lpszRemoteFile As String, _
ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean
Public Declare Function FtpSetCurrentDirectory Lib "wininet.dll" Alias "FtpSetCurrentDirectoryA" _
(ByVal hFtpSession As Long, ByVal lpszDirectory As String) As Boolean
' Initializes an lication's use of the Win32 Internet functions
Public Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" _
(ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, _
ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
' User agent constant.
Public Const scUserAgent = "vb wininet"
' Use registry access settings.
Public Const INTERNET_OPEN_TYPE_PRECONFIG = 0
Public Const INTERNET_OPEN_TYPE_DIRECT = 1
Public Const INTERNET_OPEN_TYPE_PROXY = 3
Public Const INTERNET_INVALID_PORT_NUMBER = 0
Public Const FTP_TRANER_TYPE_ASCII = &H1
Public Const FTP_TRANER_TYPE_BINARY = &H1
Public Const INTERNET_FL_PASSIVE = &H8000000
' Opens a HTTP session for a given site.
Public Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" _
(ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nServerPort As Integer, _
ByVal sUsername As String, ByVal sPassword As String, ByVal lService As Long, _
ByVal lFlags As Long, ByVal lContext As Long) As Long
Public Const ERROR_INTERNET_EXTENDED_ERROR = 12003
Public Declare Function InternetGetLastResponseInfo Lib "wininet.dll" Alias "InternetGetLastResponseInfoA" ( _
lpdwError As Long, _
ByVal lpszBuffer As String, _
lpdwBufferLength As Long) As Boolean
' Number of the TCP/IP port on the server to connect to.
Public Const INTERNET_DEFAULT_FTP_PORT = 21
Public Const INTERNET_DEFAULT_GOPHER_PORT = 70
Public Const INTERNET_DEFAULT_HTTP_PORT = 80
Public Const INTERNET_DEFAULT_HTTPS_PORT = 443
Public Const INTERNET_DEFAULT_SOCKS_PORT = 1080
Public Const INTERNET_OPTION_CONNECT_TIMEOUT = 2
Public Const INTERNET_OPTION_RECEIVE_TIMEOUT = 6
Public Const INTERNET_OPTION_SEND_TIMEOUT = 5
Public Const INTERNET_OPTION_USERNAME = 28
Public Const INTERNET_OPTION_PASSWORD = 29
Public Const INTERNET_OPTION_PROXY_USERNAME = 43
Public Const INTERNET_OPTION_PROXY_PASSWORD = 44
' Type of service to access.
Public Const INTERNET_SERVICE_FTP = 1
Public Const INTERNET_SERVICE_GOPHER = 2
Public Const INTERNET_SERVICE_HTTP = 3
' Opens an HTTP request handle.
Public Declare Function HttpOpenRequest Lib "wininet.dll" Alias "HttpOpenRequestA" _
(ByVal hHttpSession As Long, ByVal sVerb As String, ByVal sObjectName As String, ByVal sVersion As String, _
ByVal sReferer As String, ByVal something As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
' Brings the data across the wire even if it locally cached.
Public Const INTERNET_FL_RELOAD = &H80000000
Public Const INTERNET_FL_KEEP_CONNECTION = &H400000
Public Const INTERNET_FL_MULTIPART = &H200000
Public Const GENERIC_READ = &H80000000
Public Const GENERIC_WRITE = &H40000000
' Sends the specified request to the HTTP server.
Public Declare Function HttpSendRequest Lib "wininet.dll" Alias "HttpSendRequestA" (ByVal _
hHttpRequest As Long, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal sOptional As _
String, ByVal lOptionalLength As Long) As Integer
' Queries for information about an HTTP request.
Public Declare Function HttpQueryInfo Lib "wininet.dll" Alias "HttpQueryInfoA" _
(ByVal hHttpRequest As Long, ByVal lInfoLevel As Long, ByRef sBuffer As Any, _
ByRef lBufferLength As Long, ByRef lIndex As Long) As Integer
' The possible values for the lInfoLevel parameter include:
Public Const HTTP_QUERY_CONTENT_TYPE = 1
Public Const HTTP_QUERY_CONTENT_LENGTH = 5
Public Const HTTP_QUERY_EXPIRES = 10
Public Const HTTP_QUERY_LAST_MODIFIED = 11
Public Const HTTP_QUERY_PRMA = 17
Public Const HTTP_QUERY_VERSION = 18
Public Const HTTP_QUERY_STATUS_CODE = 19
Public Const HTTP_QUERY_STATUS_TEXT = 20
Public Const HTTP_QUERY_RAW_HEADERS = 21
Public Const HTTP_QUERY_RAW_HEADERS_CRLF = 22
Public Const HTTP_QUERY_FORWARDED = 30
Public Const HTTP_QUERY_SERVER = 37
Public Const HTTP_QUERY_USER_ENT = 39
Public Const HTTP_QUERY_SET_COOKIE = 43
Public Const HTTP_QUERY_REQUEST_METHOD = 45
Public Const HTTP_STATUS_DENIED = 401
Public Const HTTP_STATUS_PROXY_AUTH_REQ = 407
' Add this flag to the about flags to get request header.
Public Const HTTP_QUERY_FL_REQUEST_HEADERS = &H80000000
Public Const HTTP_QUERY_FL_NUMBER = &H20000000
' Reads data from a handle opened by the HttpOpenRequest function.
Public Declare Function InternetReadFile Lib "wininet.dll" _
(ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, _
lNumberOfBytesRead As Long) As Integer
Public Declare Function InternetWriteFile Lib "wininet.dll" _
(ByVal hFile As Long, ByVal sBuffer As String, _
ByVal lNumberOfBytesToRead As Long, _
lNumberOfBytesRead As Long) As Integer
Public Declare Function FtpOpenFile Lib "wininet.dll" Alias _
"FtpOpenFileA" (ByVal hFtpSession As Long, _
ByVal sFileName As String, ByVal lAccess As Long, _
ByVal lFlags As Long, ByVal lContext As Long) As Long
Public Declare Function FtpDeleteFile Lib "wininet.dll" _
Alias "FtpDeleteFileA" (ByVal hFtpSession As Long, _
ByVal lpszFileName As String) As Boolean
Public Declare Function InternetSetOption Lib "wininet.dll" Alias "InternetSetOptionA" _
(ByVal hInternet As Long, ByVal lOption As Long, ByRef sBuffer As Any, ByVal lBufferLength As Long) As Integer
Public Declare Function InternetSetOptionStr Lib "wininet.dll" Alias "InternetSetOptionA" _
(ByVal hInternet As Long, ByVal lOption As Long, ByVal sBuffer As String, ByVal lBufferLength As Long) As Integer
' Closes a single Internet handle or a suree of Internet handles.
Public Declare Function InternetCloseHandle Lib "wininet.dll" _
(ByVal hInet As Long) As Integer
' Queries an Internet option on the specified handle
Public Declare Function InternetQueryOption Lib "wininet.dll" Alias "InternetQueryOptionA" _
(ByVal hInternet As Long, ByVal lOption As Long, ByRef sBuffer As Any, ByRef lBufferLength As Long) As Integer
' Returns the version number of Wininet.dll.
Public Const INTERNET_OPTION_VERSION = 40
' Contains the version number of the DLL that contains the Windows Internet
' functions (Wininet.dll). This structure is used when passing the
' INTERNET_OPTION_VERSION flag to the InternetQueryOption function.
Public Type tWinInetDLLVersion
lMajorVersion As Long
lMinorVersion As Long
End Type
' Adds one or more HTTP request headers to the HTTP request handle.
Public Declare Function HttpAddRequestHeaders Lib "wininet.dll" Alias "HttpAddRequestHeadersA" _
(ByVal hHttpRequest As Long, ByVal sHeaders As String, ByVal lHeadersLength As Long, _
ByVal lModifiers As Long) As Integer
' Flags to modify the semantics of this function. Can be a combination of these values:
' Adds the header only if it does not already exist; otherwise, an error is returned.
Public Const HTTP_ADDREQ_FL_ADD_IF_NEW = &H10000000
' Adds the header if it does not exist. Used with REPLACE.
Public Const HTTP_ADDREQ_FL_ADD = &H20000000
' Replaces or removes a header. If the header value is empty and the header is found,
' it is removed. If not empty, the header value is replaced
Public Const HTTP_ADDREQ_FL_REPLACE = &H80000000
五、输入类代码,代码如下:
Option Explicit
Dim bActiveSession As Boolean
Dim hOpen As Long
Dim hConnection As Long
Dim scUserAgent As String
Dim strServer As String
Dim strUser As String
Dim strPassword As String
Dim nFlag As Long
Dim bRet As Boolean
Dim szFileLocal As String
Dim szFileRemote As String
Dim dwType As Integer
Public Function PUTFILE() As Boolean
On Error Resume Next
hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0)
hConnection = InternetConnect(hOpen, strServer, INTERNET_INVALID_PORT_NUMBER, strUser, strPassword, INTERNET_SERVICE_FTP, nFlag, 0)
bRet = FtpPutFile(hConnection, szFileLocal, szFileRemote, _
dwType, 0)
Call CloseConn
PUTFILE = bRet
End Function
Sub CloseConn()
If hConnection <> 0 Then InternetCloseHandle hConnection
hConnection = 0
End Sub
Function getRemoteName(filename)
Dim arrName() As String
arrName = Split(filename, ".")
Randomize
getRemoteName = Date & CInt(Rnd * 1000) & "." & arrName(UBound(arrName))
End Function
Private Sub Class_Initialize()
scUserAgent = "My FTP"
strServer = ".XXX.cn"
strUser = "Username"
strPassword = "Password"
nFlag = INTERNET_FL_PASSIVE
szFileLocal = "DefultLocalFileName"
szFileRemote = "DefultRemoteFileName"
dwType = 1
End Sub
Public Property Get connServer() As Variant
connServer = strServer
End Property
Public Property Let connServer(ByVal vNewValue As Variant)
strServer = vNewValue
End Property
Public Property Get connUser() As Variant
connUser = strUser
End Property
Public Property Let connUser(ByVal vNewValue As Variant)
strUser = vNewValue
End Property
Public Property Get connPassword() As Variant
connPassword = strPassword
End Property
Public Property Let connPassword(ByVal vNewValue As Variant)
strPassword = vNewValue
End Property
Public Property Let LocalFileName(ByVal vNewValue As Variant)
szFileLocal = vNewValue
szFileRemote = getRemoteName(vNewValue)
End Property
Public Property Get RemoteFileName() As Variant
RemoteFileName = szFileRemote
End Property
六、生成DLL
七、使用VB6的打包工具打包成“Internet ActiveX 安装包”,这是,VB打包后,还会给一个例子的HTML文件
八、建立HTML文件
<HTML>
<HEAD>
<TITLE>FtpConn.CAB</TITLE>
</HEAD>
<BODY>
<OBJECT ID="clsPutFile"
CLASSID="CLSID:D9BACC8F-0A99-46DA-ADA3-F1C25A48AA78"
CODEBASE="FtpConn.CAB#version=1,0,0,0">
</OBJECT>
<INPUT type="file" name="FileName"><button onclick="go()">GO~!</button>
<SCRIPT LANGUE="JaScript">
<!-- by Newrocky 2004-12-7 QQ:1936234
function go()
{
if (FileName.value!='')
{
clsPutFile.LocalFileName=FileName.value;
alert(clsPutFile.RemoteFileName);//查看远程文件名
if (clsPutFile.PutFile()) //开始传送文件,如果返回true则成功,反之失败
{
alert('上传文件成功!');
}
else
{
alert('上传文件失败!')
}
}
else
{
alert('请选择您要上传的文件');
}
}
//-->
</SCRIPT>
</BODY>
</HTML>
ok~!
===============下载部分=============
首先,声明一些变量
Dim strCommand As String
Dim strWebPage As String
为了动态设置Winsock控件的一些属性,在“开始”按钮的Click加入以下代码。
Winsock1.RemoteHost="192.168.100.101" '设置连接的IP地址
Winsock1.RemotePort = 80 '设置连接的远程端口号
Winsock1.Connect '开始连接远程计算机。
当Winsock控件连接操作完成,就可以传送FTP命令给服务器了,因此在Winsock控件的Connect中加入以下代码:
On Error Resume Next '在错误处理程序结束后,恢复原有的运行
strWebPage= " 192.168.100.101/main.htm" '设置要下载的文件'添加FTP中取得文件的命令(GET)
strCommand = "GET " + strWebPage + " HTTP/1.0" + vbCrLf
strCommand = strCommand + "Accept: */*" + vbCrLf
strCommand = strCommand + "Accept: text/html" + vbCrLf
strCommand = strCommand + vbCrLf '必须以vbCrLf结束命令
Winsock1.SendData strCommand '向远程计算机发送命令
当Winsock控件获取到数据时,需要对数据进行处理,本例中将获取的内容显示在文本框控件中,因此在Winsock控件的DataArrival加入以下代码:
On Error Resume Next '在错误处理程序结束后,恢复原有的运行
Dim webData As String
Winsock1.GetData webData,vbString '获取当前的数据块
Text1.Text = Text1.Text + webData '显示接收到的数据
Option Explicit''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Copyright ?0?81996-2009 VBnet, Randy Birch, All Rights Reserved.' Some pages may also contain other copyrights by the author.''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Distribution: You can freely use this code in your own' lications, but you may not reproduce ' or publish this code on any web site,' online service, or distribute as source ' on any media without express permission.''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''Private Const IP_SUCCESS As Long = 0Private Const IP_STATUS_BASE As Long = 11000Private Const IP_BUF_TOO_SMALL As Long = (11000 + 1)Private Const IP_DEST_NET_UNREACHABLE As Long = (11000 + 2)Private Const IP_DEST_HOST_UNREACHABLE As Long = (11000 + 3)Private Const IP_DEST_PROT_UNREACHABLE As Long = (11000 + 4)Private Const IP_DEST_PORT_UNREACHABLE As Long = (11000 + 5)Private Const IP_NO_RESOURCES As Long = (11000 + 6)Private Const IP_BAD_OPTION As Long = (11000 + 7)Private Const IP_HW_ERROR As Long = (11000 + 8)Private Const IP_PACKET_TOO_BIG As Long = (11000 + 9)Private Const IP_REQ_TIMED_OUT As Long = (11000 + 10)Private Const IP_BAD_REQ As Long = (11000 + 11)Private Const IP_BAD_ROUTE As Long = (11000 + 12)Private Const IP_TTL_EXPIRED_TRANSIT As Long = (11000 + 13)Private Const IP_TTL_EXPIRED_REASSEM As Long = (11000 + 14)Private Const IP_PARAM_PROBLEM As Long = (11000 + 15)Private Const IP_SOURCE_QUENCH As Long = (11000 + 16)Private Const IP_OPTION_TOO_BIG As Long = (11000 + 17)Private Const IP_BAD_DESTINATION As Long = (11000 + 18)Private Const IP_ADDR_DELETED As Long = (11000 + 19)Private Const IP_SPEC_MTU_CHANGE As Long = (11000 + 20)Private Const IP_MTU_CHANGE As Long = (11000 + 21)Private Const IP_UNLOAD As Long = (11000 + 22)Private Const IP_ADDR_ADDED As Long = (11000 + 23)Private Const IP_GENERAL_FAILURE As Long = (11000 + 50)Private Const MAX_IP_STATUS As Long = (11000 + 50)Private Const IP_PENDING As Long = (11000 + 255)Private Const PING_TIMEOUT As Long = 500Private Const WS_VERSION_REQD As Long = &H101Private Const MIN_SOCKETS_REQD As Long = 1Private Const SOCKET_ERROR As Long = -1Private Const INADDR_NONE As Long = &HFFFFFFFFPrivate Const MAX_WSADescription As Long = 256Private Const MAX_WSASYSStatus As Long = 128Private Type ICMP_OPTIONS Ttl As Byte Tos As Byte Flags As Byte OptionsSize As Byte OptionsData As LongEnd TypePrivate Type ICMP_ECHO_REPLY Address As Long status As Long RoundTripTime As Long DataSize As Long 'formerly integer 'Reserved As Integer DataPointer As Long Options As ICMP_OPTIONS Data As String * 250End TypePrivate Type WSADATA wVersion As Integer wHighVersion As Integer szDescription(0 To MAX_WSADescription) As Byte szSystemStatus(0 To MAX_WSASYSStatus) As Byte wMaxSockets As Long wMaxUDPDG As Long dwVendorInfo As LongEnd TypePrivate Declare Function IcmpCreateFile Lib "icmp.dll" () As LongPrivate Declare Function IcmpCloseHandle Lib "icmp.dll" _ (ByVal IcmpHandle As Long) As Long Private Declare Function IcmpSendEcho Lib "icmp.dll" _ (ByVal IcmpHandle As Long, _ ByVal DestinationAddress As Long, _ ByVal RequestData As String, _ ByVal RequestSize As Long, _ ByVal RequestOptions As Long, _ ReplyBuffer As ICMP_ECHO_REPLY, _ ByVal ReplySize As Long, _ ByVal Timeout As Long) As Long Private Declare Function WSetLastError Lib "wsock32" () As LongPrivate Declare Function WSAStartup Lib "wsock32" _ (ByVal wVersionRequired As Long, _ lpWSADATA As WSADATA) As Long Private Declare Function WSACleanup Lib "wsock32" () As LongPrivate Declare Function gethostname Lib "wsock32" _ (ByVal szHost As String, _ ByVal dwHostLen As Long) As Long Private Declare Function gethostbyname Lib "wsock32" _ (ByVal szHost As String) As LongPrivate Declare Sub CopyMemory Lib "kernel32" _ Alias "RtlMoveMemory" _ (xDest As Any, _ xSource As Any, _ ByVal nbytes As Long) Private Declare Function inet_addr Lib "wsock32" _ (ByVal s As String) As LongPrivate Sub Command1_Click() Dim ECHO As ICMP_ECHO_REPLY Dim pos As Long Dim success As Long If SocketsInitialize() Then 'ping the IP by passing the address, 'text to send, and the ECHO structure. success = Ping((Text1.Text), (Text2.Text), ECHO) 'display the results Text3(0).Text = GetStatusCode(success) Text3(1).Text = ECHO.Address Text3(2).Text = ECHO.RoundTripTime & " ms" Text3(3).Text = ECHO.DataSize & " bytes" If Left$(ECHO.Data, 1) <> Chr$(0) Then pos = InStr(ECHO.Data, Chr$(0)) Text3(4).Text = Left$(ECHO.Data, pos - 1) End If Text3(5).Text = ECHO.DataPointer SocketsCleanup Else MsgBox "Windows Sockets for 32 bit Windows " & _ "environments is not successfully responding." End If End SubPrivate Function Ping(sAddress As String, _ sDataToSend As String, _ ECHO As ICMP_ECHO_REPLY) As Long 'If Ping succeeds : '.RoundTripTime = time in ms for the ping to complete, '.Data is the data returned (NULL terminated) '.Address is the Ip address that actually replied '.DataSize is the size of the string in .Data '.Status will be 0 ' 'If Ping fails .Status will be the error code Dim hPort As Long Dim dwAddress As Long 'convert the address into a long representation dwAddress = inet_addr(sAddress) 'if a valid address.. If dwAddress <> INADDR_NONE Then 'open a port hPort = IcmpCreateFile() 'and if successful, If hPort Then 'ping it. Call IcmpSendEcho(hPort, _ dwAddress, _ sDataToSend, _ Len(sDataToSend), _ 0, _ ECHO, _ Len(ECHO), _ PING_TIMEOUT) 'return the status as ping succes and close Ping = ECHO.status Call IcmpCloseHandle(hPort) End If Else 'the address format was probably invalid Ping = INADDR_NONE End If End Function Private Sub SocketsCleanup() If WSACleanup() <> 0 Then MsgBox "Windows Sockets error occurred in Cleanup.", vbExclamation End If End SubPrivate Function SocketsInitialize() As Boolean Dim WSAD As WSADATA SocketsInitialize = WSAStartup(WS_VERSION_REQD, WSAD) = IP_SUCCESS End FunctionPrivate Function GetStatusCode(status As Long) As String Dim msg As String Select Case status Case IP_SUCCESS: msg = "ip success" Case INADDR_NONE: msg = "inet_addr: bad IP format" Case IP_BUF_TOO_SMALL: msg = "ip buf too_small" Case IP_DEST_NET_UNREACHABLE: msg = "ip dest net unreachable" Case IP_DEST_HOST_UNREACHABLE: msg = "ip dest host unreachable" Case IP_DEST_PROT_UNREACHABLE: msg = "ip dest prot unreachable" Case IP_DEST_PORT_UNREACHABLE: msg = "ip dest port unreachable" Case IP_NO_RESOURCES: msg = "ip no resources" Case IP_BAD_OPTION: msg = "ip bad option" Case IP_HW_ERROR: msg = "ip hw_error" Case IP_PACKET_TOO_BIG: msg = "ip packet too_big" Case IP_REQ_TIMED_OUT: msg = "ip req timed out" Case IP_BAD_REQ: msg = "ip bad req" Case IP_BAD_ROUTE: msg = "ip bad route" Case IP_TTL_EXPIRED_TRANSIT: msg = "ip ttl expired transit" Case IP_TTL_EXPIRED_REASSEM: msg = "ip ttl expired reassem" Case IP_PARAM_PROBLEM: msg = "ip param_problem" Case IP_SOURCE_QUENCH: msg = "ip source quench" Case IP_OPTION_TOO_BIG: msg = "ip option too_big" Case IP_BAD_DESTINATION: msg = "ip bad destination" Case IP_ADDR_DELETED: msg = "ip addr deleted" Case IP_SPEC_MTU_CHANGE: msg = "ip spec mtu change" Case IP_MTU_CHANGE: msg = "ip mtu_change" Case IP_UNLOAD: msg = "ip unload" Case IP_ADDR_ADDED: msg = "ip addr added" Case IP_GENERAL_FAILURE: msg = "ip general failure" Case IP_PENDING: msg = "ip pending" Case PING_TIMEOUT: msg = "ping timeout" Case Else: msg = "unknown msg returned" End Select GetStatusCode = CStr(status) & " [ " & msg & " ]" End Function界面参考: