注册 登录
编程论坛 VB6论坛

VB关于WINSOCK的问题

renxiaoyao36 发布于 2014-12-25 20:41, 1252 次点击
程序代码:
On Error GoTo sss
ttt:
tcpServer.LocalPort = 1999
tcpServer.Listen
tcpServer.RemoteHost = "120.204.4.248"
tcpServer.Connect
DoEvents
Sleep 30000
tcpServer.SendData (tcpServer.LocalIP)
Exit Sub
sss:
GoTo ttt

运行到黄色那一段就会出现40020错误
5分钟前运行一切正常。
现在突然无法正常运作了。
求教这是哪里出错了?
28 回复
#2
renxiaoyao362014-12-25 20:42
tcpServer.LocalPort = 1999
#3
renxiaoyao362014-12-25 20:42
tcpServer.LocalPort = 1999
这段代码出错(前面没显示出来...)
#4
xzlxzlxzl2014-12-25 22:08
On Error GoTo sss
ttt:
tcpServer.LocalPort = 1999
tcpServer.Listen
tcpServer.RemoteHost = "120.204.4.248"
tcpServer.Connect
DoEvents
Sleep 30000
tcpServer.SendData (tcpServer.LocalIP)
Exit Sub
sss:
tcpServer.close    '出错后关闭连接试试
GoTo ttt
#5
renxiaoyao362014-12-26 12:21
楼上的方法使用后,原来出错的代码不错了,但是...
tcpServer.RemoteHost = "120.204.4.248"这段代码出错了...
#6
风吹过b2014-12-26 12:30
tcpServer.LocalPort = 1999                       设置本地端口
tcpServer.Listen                                 进入侦听
tcpServer.RemoteHost = "120.204.4.248"           设置远程地址      ,无远程端口
tcpServer.Connect                                连接远程
DoEvents

其中:侦听,要求连接状态为2,并且本地端口未使用,会置状态 2 ;然后发起连接,要求连接状态0 ,然置连接状态为 6 ,然后连接成功后置 7 ,连接错误置8,远程关闭置 9
这二个动作是矛盾的。一个 winsock 不能同时进行二个相同或不同的动作,动作包括(侦听,连接)

如果是服务器端,那就只要侦听好啦。
如果是客户端,那就可以 连接远程好啦。

如果又是服务端,又是客户端,那就需要二个以上的 winsock 控件。
侦听单独一个,同意连接使用需要一组。
自己连接远程的,有几个地址需要同时连接,就需要几个。
#7
renxiaoyao362014-12-26 17:37
我把代码大改了一下,现在要求是:
客户端和服务端分离
客户端有两个form,第一个form是登陆,其中登陆时发送一个连接请求给服务器,服务器自动分发一个sock给客户端,客户端连接上服务端,客户端发送用户名及密码给服务端,服务端检查用户名及密码是否正确,若正确则传输data告诉客户端密码正确,客户端接收后关闭form1,关闭连接
form2启动,form1关闭前在外部存储一个临时文件,里面包括用户名及密码供form2调用,form2调用完毕后删除,并且重新连接。但是此时有个问题:
服务端重新连接上时,会自动跳转入登陆模块,导致客户端即使连接上服务端,也无法发送信息给服务端让服务端转送给另外的客户端,因为服务端在没有登录的情况下会丢弃所有不是登录请求的信息。
是否可以让form1关闭,form2打开时,不关闭连接呢?
#8
renxiaoyao362014-12-26 17:59
连接问题已解决,用的是服务器本地存储外部文件。
但是现在有个新问题:
一个用户(客户端)发送了一段信息来,客户端自动加上声明,服务端接受到了信息,分析信息种类,得出“该信息是要转发”的结论。此时,服务端将接受到的信息按照客户端制定的目标用户,搜索该用户所对应的IP,并且向该IP发送信息。
但是,问题是sock无法指定要发送的IP,只能固定的向一个IP发送信息,怎么办?
#9
xzlxzlxzl2014-12-26 18:31
想用vb做聊天软件?用tcp连接不是这么做的,服务器要用控件数组,否则一旦连接一个客户后,服务器端就从侦听状态变为连接状态了,没有tcp侦听,后续的就无法再连接服务器。用udp很容易做个多用户聊天软件的。
#10
renxiaoyao362014-12-26 18:35
我是控件数组
#11
renxiaoyao362014-12-26 18:37
可能是我说的不详细吧
服务器的winsock有2两个
一个是listener用来侦听
一个是sock()是用来分配给不同用户的。
sock()被我用其他方法限定为最多15个。
#12
xzlxzlxzl2014-12-26 18:47
那这样就很容易分发信息的。另信息只能分发给连接了服务器的客户端,你不可能凭空捏造一个ip来分发。
#13
renxiaoyao362014-12-26 18:58
我是这个意思——
客户端A登陆后,服务器的本地暂时存储文件内的内容是“Connected”,这时,客户端A制定发送信息XXXX给客户端B,但服务器的Sock.SendData只能给自己连接的IP发送信息,而不能给别的Sock连接的IP发送信息。如果在短时间内改变Sock.RemoteHost的参数确实可以达到发送信息给客户端B,但是此时客户端A被断开,客户端A的程序自动退出登录,我希望能够在不断开连接的情况下发送信息给客户端B,怎么办?
#14
风吹过b2014-12-26 19:13
找到B用户对的sock,然后发给它。不要用A用户这个sock了。
#15
renxiaoyao362014-12-26 20:41
但是我不知道B用户对应的sock(我的所有sock都是自动分配的)
#16
renxiaoyao362014-12-26 21:08
我的意思是:所有的sock都是程序自动分配的,我现在从A用户发来的信息中找到了B用户的IP,要找到和B用户连接的Sock,怎么办?
#17
renxiaoyao362014-12-26 21:16
另外问一下,winsock.localIP是不是本地的IP?
#18
renxiaoyao362014-12-26 21:22
请各位看看我这个思路可行么?
服务端在接受连接请求时,将连接的IP存入Tag中。
当客户端要传输信息给另外的用户时,客户端程序在信息前面加上前缀,以告诉服务端该信息的类型和发送目标
服务端分析类型和目标后,用以下代码进行搜索。
程序代码:
Sock(Index).GetData Dx, vbDouble
If Mid(Dx, 1, 3) = "For" Then
MsgTmp = Replace(Dx, "For", "")
UsersWant = InStr(2, MsgTmp, "#")
UsersWant2 = Mid(MsgTmp, 2, UsersWant - 1)
MsgTmp2 = Replace(MsgTmp, "#", "")
On Error Resume Next
back:
If Sock(a).Tag = UsersWant2 Then
Sock(a).SendData MsgTmp2
Else
a = a + 1: GoTo back
End If

各位看看这段代码有漏洞么?
#19
风吹过b2014-12-27 11:01
这样搜索没多大问题。
ip 可以 直接搜索 RemoteHost 属性的值。转发前判断一下 状态 ,不处于已连接时,不转发。我在手机上,看代码不行。
#20
renxiaoyao362014-12-27 12:17
我刚才进行了一次模拟测试,测试结果是:
客户端的remotehost用服务端得到的localhostname,但是却无法连接上。
出现的结果是:客户端发送的连接请求,服务端收不到。
请教一下:客户端.RemoteHost用服务端的LocalHostName连接的上么?
或者客户端的RemoteHost用服务端的LocalHostIP,这样可行么?
#21
renxiaoyao362014-12-27 12:43
在两台电脑上测试的情况是:
客户端永远连接不上服务端
一台电脑上的情况是:
客户端偶尔连接上服务端,测试共6次,成功连接2次,但是服务端上显示的IP却是2036和4098。
这是什么情况?
#22
renxiaoyao362014-12-27 13:32
刚才测试了一下连接状况
测试 1 次,成功 1 次,但是服务器IP显示是2760
另外,Getdata得到的数据类型是什么?Byte为什么不可以
#23
renxiaoyao362014-12-27 13:36
连接问题已解决,getdata问题已解决,暂时没有问题了。。。
#24
renxiaoyao362014-12-27 18:12
有一个新问题:运行时错误,下标越界
 Text2.Text = Replace(Text2.Text, Tg(Index), "")
以上代码出错:下标越界
当中有个Tg()数组,我是这样定义的:
Dim Tg() As String
这样定义是不是有错?
#25
renxiaoyao362014-12-27 18:18
问题已解决,现在有个新问题:
我的sock的localIP都是本地的192.168开头的局域网IP,如何将其改变为外网IP让外网用户也能连进来?
#26
xzlxzlxzl2014-12-27 19:54
你的服务器必须是外网地址才能把信息分发到非局域网的客户端。
#27
renxiaoyao362014-12-29 16:13
现在有个新问题了。。。
If tcpClient.State <> sckClosed Then
tcpClient.Close
End If
SignUp.RemoteHost = "192.168.1.103"
SignUp.localport = "1011"
SignUp.Connect
到最后一段代码出现:10049错误:本地电脑上的地址不可用。这是怎么回事?
#28
风吹过b2014-12-29 18:23
你连接远程服务器时,本地端口不要指定,让系统自己生成。感觉你这个就是指定端口造成的。

你没有指定远程的端口号。
#29
风吹过b2014-12-29 20:57
很早以前写一个练手,虽然是一个工程,二个窗体,但可以拆成二个程序运行的。有兴趣就慢慢看一下吧。包含简单的指令系统在内。

只有本站会员才能查看附件,请 登录
1