您现在的位置是: 首页 > 重装系统 重装系统

_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通?

_winsock控件 CAN

回答你那肯定是完全可以实现的啦,就利用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界面参考: