winsock组件(vb6)进行C/S传送数据,出现错误(40006,所需事物或请求的错误协议或连接状态)

kingcredit 2002-06-06 02:44:25
我想做一个WINsock数据通讯的测试,实现在客户端发送一个string,服务器端能接收到,并在text1上显示。
客户端EXE,FORM中有一个WINSOCK组件tcpClient和command组件:
Private Sub Command1_Click()
tcpClient.SendData "are you ok?"
End Sub

Private Sub Form_Load()
tcpClient.RemotePort = 1001
tcpClient.RemoteHost = "192.168.168.100"
tcpClient.Connect
End Sub


服务器端EXE,FORM中有一个WINSOCK组件tcpServer和text组件:
Private Sub Form_Load()
tcpServer.LocalPort = 1001
tcpServer.Listen
End Sub

Private Sub tcpServer_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
tcpServer.GetData strData
Text1.Text = strData
End Sub
...全文
676 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qhzxcz 2002-06-08
  • 打赏
  • 举报
回复

Private Sub Form_Load()
tcpClient.RemotePort = 1001
tcpClient.RemoteHost = "192.168.168.100"
tcpClient.Connect
End Sub
改为:
Private Sub Form_Load()
tcpClient.RemotePort = 1001
tcpClient.RemoteHost = "192.168.168.100"
IF tcpClient.state=0 then
tcpClient.Connect
end if
End Sub
另外,程序结束后最好关闭连接,
tcpClient.Protocol=0
你的问题我也遇到过,大概是因为连接后未关闭又去连接造成的,另外,跟踪是那条
语句出错了,给你我的代码.


客户端

Private Sub Form_Load()
'客户端的winsock控件初始化

If WinSockInitial(WinsockForChatInClient, sckTCPProtocol,"192.168.3.31", 1000) = False Then
MsgBox "连接失败"
Exit Sub
End If

'与服务器建立连接
If WinsockForChatInClient.State = 0 Then
WinsockForChatInClient.Connect
End If
End Sub

Function WinSockInitial(ByVal WinSock As WinSock, ByVal IntProtocol As Integer, ByVal StrHost As Variant, ByVal IntPort As Integer) As Boolean

'winsock控件初始化(协议,连接主机,连接的端口号),



'初始化0—'''''''''''''''''''''''''''''''''
On Error GoTo localerror

'初始化
WinSockInitial = True
WinSock.Close
'
WinSock.Protocol = IntProtocol
WinSock.RemoteHost = StrHost
WinSock.RemotePort = IntPort
End Function

Private Sub Form_Unload(Cancel As Integer)
WinsockForChatInClient.Close
End Sub

Private Sub TxtForSend_KeyDown(KeyCode As Integer, Shift As Integer)

'在文本(框TxtForSend)中输入数据再按回车发送数据到服务器
If KeyCode = vbKeyReturn Then
WinsockForChatInClient.SendData TxtForSend.Text
End If


'服务端(winsock 控件WinsockForChatInServe和文本框TxtForGetData)

Private Sub WinsockForChatInServer_ConnectionRequest(ByVal requestID As Long)
''接受请求
If WinsockForChatInServer.State <> sckClosed Then
WinsockForChatInServer.Close
End If
WinsockForChatInServer.Accept requestID

End Sub

Private Sub WinsockForChatInServer_DataArrival(ByVal bytesTotal As Long)
WinsockForChatInServer.GetData strData, vbString
TxtForGetData.Text = TxtForGetData.Text + strData
End Sub

Private Sub Form_Load()
''服务端的winsock控件初始化
Dim ServerIp As String
If WinSockInitial(WinsockForChatInServer, sckTCPProtocol, "", 1000) = False Then
MsgBox "连接失败"
Exit Sub
End If

'扫描各客户端,检查是否有连接请求
WinsockForChatInServer.Listen
End Sub

Function WinSockInitial(ByVal WinSock As WinSock, ByVal IntProtocol As Integer, ByVal StrHost As Variant, ByVal IntPort As Integer) As Boolean

'winsock控件初始化(连接的端口号),
WinSock.LocalPort = IntPort
End Function

kingcredit 2002-06-08
  • 打赏
  • 举报
回复
多谢各位兄弟帮忙,小弟已经调通程序,
问题就在没有connect到服务端,就调用senddata方法,
故出错,看来以后,要经常看MSDN。
kingcredit 2002-06-08
  • 打赏
  • 举报
回复
问题如上,我用单步跟踪,执行到语句:
tcpClient.SendData "are you ok?"
出现这个错误号。
按照audio兄的提示,我重写客户端代码,如下
Private Sub Form_Load()
If WinSockInitial(tcpClient, sckTCPProtocol, "192.168.168.200", 1001) = False Then
MsgBox "连接失败"
Exit Sub
End If
If tcpClient.State = 0 Then
tcpClient.Connect
End If
End Sub


Private Sub Form_Unload(Cancel As Integer)
tcpClient.Close
End Sub

Function WinSockInitial(ByVal WinSock As WinSock, ByVal IntProtocol As Integer, ByVal StrHost As Variant, ByVal IntPort As Integer) As Boolean
WinSockInitial = True
WinSock.Close
WinSock.Protocol = IntProtocol
WinSock.RemoteHost = StrHost
WinSock.RemotePort = IntPort
On Error GoTo localerror
WinSock.Connect
localerror:
WinSockInitial = False
End Function
还是不行,我怀疑是不是tcpClient.connect根本就没有连接上服务器
如果是这样,如何处理?
我的运行环境是win2000(AS)+vb6中文版。
remanwang 2002-06-07
  • 打赏
  • 举报
回复
你的操作系统不会还是win95吧?
zhplovelsy 2002-06-07
  • 打赏
  • 举报
回复
在客户端将remotehost设置为服务器的机器名试试
再或者将winsock.connect放在另外的一个按钮click事件中试试
kingcredit 2002-06-07
  • 打赏
  • 举报
回复
还是不行,错误号相同。请兄弟们帮帮我。
客户端EXE,FORM中有一个WINSOCK组件tcpClient和command组件:
Private Sub Command1_Click()
tcpClient.SendData "are you ok?"
End Sub

Private Sub Form_Load()
tcpClient.RemotePort = 1001
tcpClient.RemoteHost = "192.168.168.100"
tcpClient.Connect
End Sub

服务器端EXE,FORM中有一个WINSOCK组件tcpServer和text组件:
Private Sub Form_Load()
tcpServer.LocalPort = 1001
tcpServer.Listen
End Sub

Private Sub tcpServer_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
If tcpServer.State = 7 Then
tcpServer.GetData strData
Text1.Text = strData
End If
End Sub


Private Sub tcpServer_ConnectionRequest(ByVal requestID As Long)
If tcpServer.State <> sckClosed Then tcpServer.Close
tcpServer.Accept requestID
End Sub
我是运行Server.exe,然后再打开的Client.exe。
后来我放在同一个窗体上放了两个winsock,运行这些代码也不行。
qhzxcz 2002-06-06
  • 打赏
  • 举报
回复
注意要先打开服务器端程序,再打开客户端程序.
另还得像楼上几位所说的加上应有的判断
Private Sub tcpServer_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
if TcpServer.State=7 then
tcpServer.GetData strData
Text1.Text = strData
endif
End Sub

cdnicle 2002-06-06
  • 打赏
  • 举报
回复
服务器端要使用requestID语句,并且这个WINSOCK控件不能是发送和接受字符的那个控件!
youquan 2002-06-06
  • 打赏
  • 举报
回复
加一个winsock控件的状态判断即可,客户端的winsock也要加
Private Sub tcpServer_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
if TcpServer.State=7 then
tcpServer.GetData strData
Text1.Text = strData
endif
End Sub
remanwang 2002-06-06
  • 打赏
  • 举报
回复
server还少了这块代码:
Private Sub tcpServer_ConnectionRequest (ByVal requestID As Long)
If tcpServer.State <> sckClosed Then tcpServer.Close
tcpServer.Accept requestID
End Sub


多读msdn,就明白了.

7,783

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧