同一台机器用Winsock通讯,怎么不行
本机IP为192.168.0.20
win2000sp1 + VB6SP5
在同一VB程序中添加两个Winsock控件wsk1和wsk2,
wsk1.LocalPort = 2000
wsk1.RemotePort = 3000
wsk1.RemoteHost = 192.168.0.20
wsk2.LocalPort = 3000
wsk2.RemotePort = 2000
wsk2.RemoteHost = 192.168.0.20
执行
wsk1.SendData "Hello"
wsk2的DataArrival事件未触发
而wsk1的DataArrival事件却接受到了"Hello"
而且,wsk1的两个端口值取任何合法的值,DataArrival事件都会响应
wsk2却始终无动于衷
同样,通一台机器上的两个VB程序用winsock控件UDP通信,
只有发送消息的控件才能收到消息。
不知为何?以前好像不是这样的。
问题点数:100、回复次数:16Top
1 楼didibaba(落花有意兮流水无情,郁闷!!!)回复于 2002-06-15 03:53:01 得分 10
一定可以的,只要是2个不同的端口。至于你的机器为什么不行,就不知道了。Top
2 楼shanhe(TNT)回复于 2002-06-15 08:38:24 得分 10
服务器端设定监听端口,但是客户端一定不要设定localport
Top
3 楼wmy997(柯南)回复于 2002-06-15 08:42:51 得分 10
试一试
wsk1.RemotePort = 3000
wsk1.RemoteHost = "192.168.0.20"
wsk1.bind 2000,"192.168.0.20"
wsk2.RemotePort = 2000
wsk2.RemoteHost = "192.168.0.20"
wsk2.bind 3000,"192.168.0.20"
Top
4 楼ywchen2000(灌水大帝:努力奋斗)回复于 2002-06-16 12:27:58 得分 10
可以通讯
我写个这样的程序
将协议该为UDP!
不需要BINDTop
5 楼daehappy(追求120%结贴)回复于 2002-06-16 18:26:16 得分 0
up!关注!Top
6 楼ywchen2000(灌水大帝:努力奋斗)回复于 2002-06-16 20:15:44 得分 10
private command1_clicl()
winsock1.senddata text2.text
endsub
private sub form_load()
winsock1.protocol=sckudpprotocol
winsock1.remotohost="202.201.10.21"
winsock1.localport=1011
winsock1.remoteport=1010
endsub
private sub winsock1_dattaarrival(byval bytes totol as long)
dim data as string
winsock1.getdata data,vbstring
text1.text=data+chr(13)+chr(10)+text1.text
endsub
程序二
private sub command2_click()
winsock1.seddata text3.text
end sub
private sub form_load()
winsock1.protocol=sckudppprotocol
winsock1.remotehost="202.10.1.11"
winsock1.localport=1010
winsock1.remoteport=1011
end sub
private sub winsock1_dataarrival(byval bytestotal string)
dim data1 as string
winsock1.getdata data1,vbstring
text2.text=data1+chr(13)+chr(10)+tex2.text
end subTop
7 楼bestofbest(咖啡)回复于 2002-06-16 23:25:50 得分 10
应该可以
我以前就是在一台机器上实验我的程序
Top
8 楼luckysym(热带风暴)回复于 2002-06-18 00:46:52 得分 0
用bind 就搞定了Top
9 楼Boolean_true(李大嘴)回复于 2002-06-18 01:30:38 得分 10
一看就知道你用的是DUP pro
DUP程序没有主客之分,只要指定对方的IP:port就可以发信一般情况下要绑定端口在发信之前先设置对方的IP:port
winsock.reHOST=""
winsock.reIP=port
winsock.SendData Str
就可以了,
千万不要在reQuest()中加代码!
还有就是有可能你在senddata方法使用过程中有错误,
不过没关系,只要on error resume next 就可以了,
祝你玩的开心,还有呀,
用DUP 不能得到对方的IP:port
所以,编写通讯程序时,可以在发送的信息是加入这些信息!
以便于对方程序给予回复!
你的代码我看过了,绑定一下再试一试吧!
祝你成功
Top
10 楼gys_yxr(毛毛)回复于 2002-06-18 12:12:44 得分 0
可以的我正在用Top
11 楼ywchen2000(灌水大帝:努力奋斗)回复于 2002-06-21 18:08:09 得分 0
upTop
12 楼AQS432(Sxj)回复于 2002-06-21 18:10:29 得分 10
应该行的呀
注意ip和端口值。Top
13 楼lonelystarcn(虫虫)回复于 2002-06-21 18:15:27 得分 10
UDP协议不存在服务端客户端,它是面向无连接的。
应当分别加上
wsk1.bind
wsk2.bind
Top
14 楼KAIBate(凯)回复于 2002-06-21 18:20:31 得分 0
UPUP!Top
15 楼sunxl(小呆)回复于 2002-06-21 18:22:30 得分 10
UDP 初步
创建 UDP 应用程序比创建 TCP 应用程序还要简单,因为 UDP 协议不需要显式的连接。在上面的 TCP 应用程序中,一个 Winsock 控件必须显式地进行“监听”,另一个必须使用 Connect 方法初始化连接。
UDP 协议不需要显式的连接。要在两个控件中间发送数据,需要完成以下的三步(在连接的双方):
将 RemoteHost 属性设置为另一台计算机的名称。
将 RemotePort 属性设置为第二个控件的 LocalPort 属性。
调用 Bind 方法,指定使用的 LocalPort。(下面将详细地讨论该方法。)
因为两台计算机的地位可以看成“平等的”,这种应用程序也被称为点到点的。为了具体说明这个问题,下面将创建一个“聊天”应用程序,两个人可以通过它进行实时的交谈。
要创建一个 UDP 伙伴,请按照以下步骤执行:
创建一个新的 Standard EXE 工程。
将缺省的窗体的名称修改为 frmPeerA。
将窗体的标题修改为“Peer A”。
在窗体中放入一个 Winsock 控件,并将其命名为 udpPeerA。
在“属性”页上,单击“协议”并将协议修改为 UDPProtocol。
在窗体中添加两个 TextBox 控件。将第一个命名为 txtSend,第二个命名为 txtOutput。
为窗体增加如下的代码。
Private Sub Form_Load()
'控件的名字为 udpPeerA
With udpPeerA
'重点:必须将 RemoteHost 的值
'修改为计算机的名字。
.RemoteHost= "PeerB"
.RemotePort = 1001 '连接的端口号。
.Bind 1002 '绑定到本地的端口。
End With
frmPeerB.Show '显示第二个窗体。
End Sub
Private Sub txtSend_Change()
'在键入文本时,立即将其发送出去。
udpPeerA.SendData txtSend.Text
End Sub
Private Sub udpPeerA_DataArrival _
(ByVal bytesTotal As Long)
Dim strData As String
udpPeerA.GetData strData
txtOutput.Text = strData
End Sub
要创建第二个 UDP 伙伴,请按照以下步骤执行:
在工程中添加一个标准窗体。
将窗体的名字修改为 frmPeerB。
将窗体的标题修改为“Peer B”。
在窗体中放入一个 Winsock 控件,并将其命名为 udpPeerB。
在“属性”页上,单击“协议”并将协议修改为“UDPProtocol”。
在窗体上添加两个 TextBox 控件。将第一个命名为 txtSend,第二个命名为 txtOutput。
在窗体中添加如下的代码。
Private Sub Form_Load()
'控件的名字为 udpPeerB。
With udpPeerB
'重点:必须将 RemoteHost 的值改为
'计算机的名字。
.RemoteHost= "PeerA"
.RemotePort = 1002 '要连接的端口。
.Bind 1001 '绑定到本地的端口上。
End With
End Sub
Private Sub txtSend_Change()
'在键入后立即发送文本。
udpPeerB.SendData txtSend.Text
End Sub
Private Sub udpPeerB_DataArrival _
(ByVal bytesTotal As Long)
Dim strData As String
udpPeerB.GetData strData
txtOutput.Text = strData
End Sub
如果要试用上面的例子,按 F5 键运行工程,然后在两个窗体的 txtSend TextBox 中分别键入一些文本。键入的文字将出现在另一个窗体的 txtOutput TextBox 中。
关于 Bind 方法
在上面的代码中,在创建 UDP 应用程序时调用了 Bind 方法,这是必须的。Bind 方法的作用是为控件“保留”一个本地端口。例如,如果将控件绑定到 1001 号端口,那么其它应用程序将不能使用该端口进行“监听”。该方法阻止其它应用程序使用同样的端口。
Bind 方法的第二个参数是任选的。如果计算机上存在多个网络适配器,可以用 LocalIP 参数来指定使用哪一个适配器。如果忽略该参数,控件使用的将是计算机上“控制面板”设置中“网络”控制面板对话框中列出的第一个适配器。
在使用 UDP 协议的时候,可以任意地改变 RemoteHost 和 RemotePort 属性,同时始终保持绑定在同一个 LocalPort 上。TCP 协议与此不同,在改变 RemoteHost 和 RemotePort 属性之前,必须先关闭连接。
Top
16 楼ywchen2000(灌水大帝:努力奋斗)回复于 2002-06-28 20:56:26 得分 0
接帐Top




