您现在的位置是: 首页 > 电脑故障 电脑故障
_winsock connect 没反应
tamoadmin 2024-08-13 人已围观
简介1.VB发送封包代码(请大神修改一下)把下面的代码复制下来,保存为"frmServer.frm"VERSION 5.00Object = "{248DD890-BB45-11CF-9ABC-0080C7E7B78D}#1.0#0"; "MSWINSCK.OCX"Begin VB.Form frmServer Caption = "TCP 服务器" ClientHeig
1.VB发送封包代码(请大神修改一下)
把下面的代码复制下来,保存为"frmServer.frm"
VERSION 5.00
Object = "{248DD890-BB45-11CF-9ABC-0080C7E7B78D}#1.0#0"; "MSWINSCK.OCX"
Begin VB.Form frmServer
Caption = "TCP 服务器"
ClientHeight = 4470
ClientLeft = 60
ClientTop = 345
ClientWidth = 6015
LinkTopic = "Form1"
ScaleHeight = 4470
ScaleWidth = 6015
StartUpPosition = 3 '窗口缺省
Begin VB.TextBox txtOutput
Height = 2415
Left = 240
Locked = -1 'True
MultiLine = -1 'True
TabIndex = 1
Top = 120
Width = 5175
End
Begin VB.TextBox txtSendData
Height = 1455
Left = 240
MultiLine = -1 'True
TabIndex = 0
Top = 2760
Width = 5175
End
Begin MSWinsockLib.Winsock tcpServer
Left = 5520
Top = 360
_ExtentX = 741
_ExtentY = 741
_Version = 393216
End
End
Attribute VB_Name = "frmServer"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Sub Form_Load()
'将 LocalPort 属性设置为一个整数。
'然后调用 Listen 方法。
tcpServer.LocalPort = 1001
tcpServer.Listen
frmClient.Show '显示客户端的窗体。
End Sub
Private Sub tcpServer_ConnectionRequest _
(ByVal requestID As Long)
'检查控件的 State 属性是否为关闭的。
'如果不是,
'在接受新的连接之前先关闭此连接。
If tcpServer.State <> sckClosed Then _
tcpServer.Close
'接受具有 requestID 参数的
'连接。
tcpServer.Accept requestID
End Sub
Private Sub txtSendData_Change()
'名为 txtSendData 的 TextBox 控件中
'包含了要发送的数据。当用户往文本框中
'键入数据时,使用 SendData 方法
'发送输入的字符串。
tcpServer.SendData txtSendData.Text
End Sub
Private Sub tcpServer_DataArrival _
(ByVal bytesTotal As Long)
'为进入的数据声明一个变量。
'调用 GetData 方法,并将数据赋予名为 txtOutput
'的 TextBox 的 Text 属性。
Dim strData As String
tcpServer.GetData strData
txtOutput.Text = strData
End Sub
把下面的代码复制下来.保存为"frmClient.frm"
VERSION 5.00
Object = "{248DD890-BB45-11CF-9ABC-0080C7E7B78D}#1.0#0"; "MSWINSCK.OCX"
Begin VB.Form frmClient
Caption = "TCP Client"
ClientHeight = 3870
ClientLeft = 60
ClientTop = 375
ClientWidth = 7425
LinkTopic = "Form1"
ScaleHeight = 3870
ScaleWidth = 7425
StartUpPosition = 3 '窗口缺省
Begin VB.CommandButton cmdConnect
Caption = "Connect"
Height = 540
Left = 6000
TabIndex = 2
Top = 1080
Width = 5
End
Begin VB.TextBox txtOutput
Height = 2175
Left = 240
Locked = -1 'True
MultiLine = -1 'True
TabIndex = 1
Top = 240
Width = 5535
End
Begin VB.TextBox txtSendData
Height = 5
Left = 240
MultiLine = -1 'True
TabIndex = 0
Top = 2640
Width = 5535
End
Begin MSWinsockLib.Winsock tcpClient
Left = 6600
Top = 120
_ExtentX = 741
_ExtentY = 741
_Version = 393216
End
End
Attribute VB_Name = "frmClient"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Sub Form_Load()
'Winsock 控件的名字为 tcpClient。
'注意:要指定远程主机,可以使用
' IP 地址(例如:"121.111.1.1"),也可以使用
'计算机的“好听的名字”如下所示。
tcpClient.RemoteHost = "127.0.0.1"
tcpClient.RemotePort = 1001
End Sub
Private Sub cmdConnect_Click()
'调用 Connect 方法,初始化连接。
tcpClient.Connect
End Sub
Private Sub txtSendData_Change()
tcpClient.SendData txtSendData.Text
End Sub
Private Sub tcpClient_DataArrival _
(ByVal bytesTotal As Long)
Dim strData As String
tcpClient.GetData strData
txtOutput.Text = strData
End Sub
把下面的代码复制下来.保存为"Project1.vbp"
Type=Exe
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\WINDOWS\system32\stdole2.tlb#OLE Automation
Object={F6125AB1-8AB1-11CE-A77F-08002B2F4E98}#2.0#0; MSRDC20.OCX
Object={BDC217C8-ED16-11CD-956C-0000C04E4C0A}#1.1#0; TABCTL32.OCX
Object={5E9E78A0-531B-11CF-91F6-C2863C385E30}#1.0#0; MLXGRD.OCX
Object={F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0; COMDLG32.OCX
Object={831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0; MSCOMCTL.OCX
Object={86CF1D34-0C5F-11D2-A9FC-0000F8754DA1}#2.0#0; MSCOMCT2.OCX
Object={48E59290-9880-11CF-54-00AA00C00908}#1.0#0; MSINET.OCX
Object={3B7C8863-D78F-101B-B9B5-04021C009402}#1.2#0; RICHTX32.OCX
Object={65E121D4-0C60-11D2-A9FC-0000F8754DA1}#2.0#0; MSCHRT20.OCX
Object={248DD890-BB45-11CF-9ABC-0080C7E7B78D}#1.0#0; MSWINSCK.OCX
Object={20C62CAE-15DA-101B-B9A8-444553540000}#1.1#0; MSMAPI32.OCX
Object={C1A8AF28-1257-101B-8FB0-0020AF039CA3}#1.1#0; MCI32.OCX
Object={27395F88-0C0C-101B-A3C9-08002B2F49FB}#1.1#0; PICCLP32.OCX
Object={6FBA474E-43AC-11CE-9A0E-00AA0062BB4C}#1.0#0; SYSINFO.OCX
Object={648A5603-2C6E-101B-82B6-000000000014}#1.1#0; MSCOMM32.OCX
Object={C932BA88-4374-101B-A56C-00AA003668DC}#1.1#0; MSMASK32.OCX
Object={CDE57A40-8B86-11D0-B3C6-00A0C90AEA82}#1.0#0; MSDATGRD.OCX
Object={F0D2F211-CCB0-11D0-A316-00AA00688B10}#1.0#0; MSDATLST.OCX
Object={38911DA0-E448-11D0-84A3-00DD01104159}#1.1#0; COMCT332.OCX
Object={673AA1-7FB1-11D0-B148-00A0C922E820}#6.0#0; MSADODC.OCX
Object={0ECD9B60-23AA-11D0-B351-00A0C9055D8E}#6.0#0; MSHFLXGD.OCX
Form=frmServer.frm
Form=frmClient.frm
IconForm="frmServer"
Startup="frmServer"
Command32=""
Name="Project1"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
VersionCompanyName="Company"
CompilationType=0
OptimizationType=0
ForPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
DebugStartupOption=0
[MS Transaction Server]
AutoRefresh=1
这三个文件就是工程文件了.源代码就在里面.
VB发送封包代码(请大神修改一下)
我这里有一个简单的聊天室程序:包括服务器和客户端
用VB的winsock实现的,需要跟我联系就是,免费赠送。
QQ361656515
网络编程——聊天室(代码如下)
本程序是基于VB开发环境中Winsock控件的应用,遵循TCP/IP协议,利用该控件的套接字功能,实现远程计算机之间数据通信的,它由服务器和客户端组成。服务器用于连接多个客户端,可以统计已经连接过服务器的人数和服务器当前的在线人数,并负责收发各客户发送的消息,实现多个客户之间实时、准确、无误的数据通信。该程序可以连接1000个客户端,而如果要增减可供连接的客户端,只需对源程序的客户上限稍加改动即可。
工作原理
服务器:运行时声明一组Winsock控件数组,只创建该数组的第一个数组元素并从9999端口开始侦听(listen),当有客户端连接第一个Winsock控件并且连接成功时,触发Winsock_ConnectRequest(),端口数(Localport)递减1单位,此时运用Load Winsock(i)方法创建下一个Winsock控件数组元素并让它开始侦听,继续等待新客户端的连接,如此往复。当连接人数达到既定的客户端上限时,服务器便停止创建新的Winsock控件数组元素,停止侦听,即停止连接客户。服务器与客户端连接成功之后,通过Winsock的DataArrival()、SendData和GetData方法来实现数据的发送和接收。服务器中用一个Locked属性设定为True的文本框来记录所有客户发送的消息(聊天记录)。
客户端:运行时只创建一个Winsock控件,从9999开始递减依次指定Winsock的远程端口并依次连接远程服务器,一旦连接成功就停止指定端口,且由此可以开始和服务器通信。
用一个Locked属性设定为True的文本框来记录所有客户发送的消息,用一个可编辑的文本框来输入客户要发送的消息,这样就基本实现了聊天室的功能。
程序代码
服务器:
Option Explicit
Dim guest As Integer '在线客户数量计数器
Dim j As Integer '已接客户数量计数器
Dim k As Integer '向在线客户发送消息数量计数器
Dim t As Integer '关闭服务器时向在线客户发送消息数量计数器
Dim port As Integer '端口计数器
Dim msg As String '收发的消息文本
Dim newguest As Integer '新客户连接
Private Sub Form_Load()
If App.PrevInstance Then MsgBox "对不起!您已经创建了一个服务器^_^": End
j = 0
guest = 0
port = 9999
Text2 = Winsock1(0).LocalIP
Label3.Caption = "在线人数:" & guest
Label4.Caption = "已接人数:" & j
Winsock1(0).LocalPort = port 'Winsock控件数组第一个控件开始侦听
Winsock1(0).Listen
End Sub
Private Sub Form_Unload(Cancel As Integer) '关闭服务器时缓冲,发送断开信号
Cancel = 1
t = 0
Timer2.Enabled = 1
End Sub
Private Sub Timer1_Timer()
On Error Resume Next '错误处理
Winsock1(k).SendData msg '向所有客户发送即时收到的消息
k = k + 1
If k >= j Then Timer1.Enabled = 0
End Sub
Private Sub Timer2_Timer() '向客户发送断开信号
On Error Resume Next
msg = "closewinsock"
Winsock1(t).SendData msg
t = t + 1
If t > j Then End
End Sub
Private Sub Timer3_Timer() '向新客户发送欢迎信息
On Error Resume Next
If k = newguest Then Exit Sub
Winsock1(k).SendData msg
k = k + 1
If k >= j Then Timer3.Enabled = 0
End Sub
Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
On Error Resume Next
Dim onlineperson As String
msg = ""
If Winsock1(Index).State <> sckClosed Then Winsock1(Index).Close '成功连接
Winsock1(Index).Accept requestID
j = j + 1 '统计已接人数
If guest + 1 < 10 Then
onlineperson = "currentonlineperson00" + CStr(guest + 1) + msg
ElseIf guest + 1 < 100 Then
onlineperson = "currentonlineperson0" + CStr(guest + 1) + msg
End If
Winsock1(Index).SendData onlineperson & "您是第" & CStr(j) & "位进入本聊天室的客户^_^" + Chr(13) + Chr(10)
msg = onlineperson & "第" & CStr(j) & "位客户进入了本聊天室" + Chr(13) + Chr(10)
Text1 = Text1 +"第" & CStr(j) & "位客户进入了本聊天室" + Chr(13) + Chr(10)
k = 0
newguest = Index
Timer3.Enabled = 1
Text1.SelStart = Len(Text1)
guest = guest + 1 '统计在线人数
Label3.Caption = "在线人数:" & guest
Label4.Caption = "已接人数:" & j
Load Winsock1(j)
port = port - 1
Winsock1(j).LocalPort = port
Winsock1(j).Listen
End Sub
Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
On Error Resume Next
Dim i As Integer
Dim onlineperson As String
msg = ""
Winsock1(Index).GetData msg '发送断开信号
If msg = "closewinsock" Then
msg = ""
Winsock1(Index).Close
If guest - 1 < 10 Then
onlineperson = "currentonlineperson00" + CStr(guest - 1)
ElseIf guest < 100 Then
onlineperson = "currentonlineperson0" + CStr(guest - 1)
End If
msg = "第" & CStr(Index + 1) & "位客户已经离开" + Chr(13) + Chr(10)
Text1 = Text1 + msg
msg = onlineperson & "第" & CStr(Index + 1) & "位客户已经离开" + Chr(13) + Chr(10)
Text1.SelStart = Len(Text1)
k = 0
Timer1.Enabled = 1
guest = guest - 1
Label3.Caption = "在线人数:" & guest
Label4.Caption = "已接人数:" & j
Exit Sub
End If
msg = "第" + CStr(Index + 1) + "位客户说:" + msg + Chr(13) + Chr(10)
Text1 = Text1 + msg
Text1.SelStart = Len(Text1)
k = 0
Timer1.Enabled = 1
End Sub
客户端:
Dim linkstate As Boolean '判断连接状态
Dim port As Integer '依次尝试连接的端口
Private Sub Cmdconnect_Click()
On Error Resume Next
Dim t As String
Dim x As String
Dim y As Integer
y = 0
If Len(Text1) = 0 Then Exit Sub '判断输入的IP地址是否合法
For i = 1 To Len(Text1)
If Mid(Text1, i, 1) <> "." Then
t = t + Mid(Text1, i, 1)
x = ""
Else
y = y + 1
x = x + Mid(Text1, i, 1)
t = ""
End If
If Len(t) > 3 Or x = ".." Or Left(Text1, 1) = "." Or Right(Text1, 1) = "." Then
MsgBox "请输入正确的IP地址^_^", vbOKOnly + vbInformation, "连接": Exit Sub
End If
Next i
If y <> 3 Then MsgBox "请输入正确的IP地址^_^", vbOKOnly + vbInformation, "连接": Exit Sub
If Text1 Like "*.*.*.*" Then
If Cmdconnect.Caption = "&Link" Then '用户选择连接
Cmdconnect.Caption = "&Break"
Timer1.Enabled = 1
Text1.Enabled = 0
Else '用户选择中断连接
Label4.Caption = "在线人数:0"
Text2 = Text2 + "连接中断" + Chr(13) + Chr(10)
Text2.SelStart = Len(Text2)
Timer1.Enabled = 0
Text1.Enabled = 1
Text1.SetFocus
Cmdconnect.Caption = "&Link"
Winsock1.SendData "closewinsock"
linkstate = False
port = 9999
Text3.Enabled = False
cmdsend.Enabled = False
End If
End If
End Sub
Private Sub cmdsend_Click()
On Error Resume Next '发送消息
Winsock1.SendData Text3
Text3 = ""
Text3.SetFocus
End Sub
Private Sub Form_Load()
linkstate = False
port = 9999
End Sub
Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
Winsock1.SendData "closewinsock" '向服务器发送断开信号
Cancel = 1
Timer2.Enabled = 1
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer) '禁止用户输入非法IP地址
If KeyAscii < 48 Or KeyAscii > 57 Then
If KeyAscii <> 8 And KeyAscii <> 46 Then KeyAscii = 0
End If
End Sub
Private Sub Text2_KeyPress(KeyAscii As Integer)
If Text3.Enabled = False Then Exit Sub
If KeyAscii = 13 Then Call cmdsend_Click
Text3 = Text3 + Chr(KeyAscii)
End Sub
Private Sub Text3_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then Call cmdsend_Click
End Sub
Private Sub Timer1_Timer() '从9999端口依次尝试连接服务器
If linkstate = True Then Exit Sub
Winsock1.Close
Winsock1.RemoteHost = Text1.Text
Winsock1.RemotePort = port
Winsock1.Connect
port = port - 1
If port < 9000 Then '设置可供连接的端口上限
Timer1.Enabled = 0
Text1.Enabled = 1
Cmdconnect.Caption = "&Link"
port = 9999
MsgBox "无法连接到服务器,请检查网络连接状况", vbOKOnly + vbCritical, "连接"
End If
End Sub
Private Sub Timer2_Timer() '缓冲以发送断开信号
End
End Sub
Private Sub Winsock1_Connect()
port = port + 1
Timer1.Enabled = 0
linkstate = True
Text3.Enabled = 0
cmdsend.Enabled = 0
MsgBox "已经成功连接", vbOKOnly + vbInformation, "连接"
Text3.Enabled = 1
cmdsend.Enabled = 1
Text3.SetFocus
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim msg As String
Winsock1.GetData msg '接收服务器传来的的数据并进行相应处理
If Left(CStr(msg), 19) = "currentonlineperson" Then
Label4.Caption = "在线人数:" & Str(Val(Mid(CStr(msg), 20, 3)))
msg = Right(CStr(msg), Len(CStr(msg)) - 22)
End If
If CStr(msg) = "closewinsock" Then
Call Cmdconnect_Click
Text2.SelStart = Len(Text2)
Exit Sub
End If
Text2 = Text2 + msg
Text2.SelStart = Len(Text2)
End Sub
Private Sub Command1_Click()
Winsock1.RemoteHost = "203.195.128.203" '此为目标IP地址
Winsock1.RemotePort = "443" '此为目标IP地址的端口
Winsock1.Connect
end sub
Private Sub Winsock1_Connect()
Winsock1.SendData "00 BC 04 10 00 00 00 00 08 86 8E 06 08 86 8E 06"
Winsock1.SendData "08 92 8E 06 08 86 8E 06 08 92 8E 06 08 92 8E 06"
Winsock1.SendData "08 FB 8E 06 08 F5 8E 06 08 91 8E 06 08 86 8E 06"
Winsock1.SendData "08 91 8E 06 08 E9 8E 06 08 8E 06 08 F6 8E 06"
Winsock1.SendData "08 86 8E 06 08 8E 06 08 91 8E 06 08 8E 06"
Winsock1.SendData "08 F8 8E 06 08 94 8E 06 08 EA 8E 06 08 94 8E 06"
Winsock1.SendData "08 94 8E 06 08 85 8E 06 08 85 8E 06 08 85 8E 06"
Winsock1.SendData "08 89 8E 06 08 ED 8E 06 08 89 8E 06 08 89 8E 06"
Winsock1.SendData "08 89 8E 06 08 88 8E 06 08 EC 8E 06 08 8C 8E 06"
Winsock1.SendData "08 8C 8E 06 08 8C 8E 06 08 8C 8E 06 08 8C 8E 06"
Winsock1.SendData "08 EF 8E 06 08 8B 8E 06 08 8B 8E 06 08 8B 8E 06"
End Sub