关于SOCKET发送16进制数据

shepherd228 2005-07-25 12:00:55
小弟最近在做一个软件,但对SOCKET不熟悉,想请各位大侠能否给一段通过SOCKET发送和接受16进制数据的完整代码,感激不尽!如果有人熟悉MODBUS TCP/IP协议的(工业控制),请指点一二,小弟必定另外开贴送200分。先行谢过了
...全文
575 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
shepherd228 2005-07-26
  • 打赏
  • 举报
回复
非常感谢!!!
wosirius 2005-07-26
  • 打赏
  • 举报
回复
用于通过socks接收文件,可以发超长文件,多长都没关系(不限定于8K)噢:),当然阿,我这里取的分包不超过&HFF,如果想要更多的包,你把里面自己改一下。





'客户端
Option Explicit
Dim IsConnectionOpen As Boolean
Public ReadPos As Long
Public lenth As Long
Public ReadFileNo As Integer '读写文件号
Public i As Long


Private Sub Command1_Click() '联接按钮
If Command1.Caption = "连接服务器" Then '如果caption为连接服务器,点

击进行连接行为
Winsock1.RemoteHost = Trim(Text1.Text) '填好Socket的对方地址
Winsock1.RemotePort = CLng(Text2.Text) '及对方端口号
Winsock1.Connect 'Socket发送联接请求,当联接成功时出发Winsock的

Connect事件(看下边)
Command1.Enabled = False '自身灰化
DoEvents '等待连接处理(这里主要是考虑到远程的时候网络可能要等待)
Command1.Enabled = True '连上之后,或者连不上之后重新处于可用状态

If IsConnectionOpen = True Then '连接上后,按钮的caption文字改变
Command1.Caption = "断开服务器"

Else '连接不上,按钮的caption文字改变,并且关闭SOCKS连接
Command1.Caption = "连接服务器"
MsgBox "无法连接到服务器!"
Winsock1.Close
End If

Else '如果caption为断开服务器,点击进行断开行为
Command1.Caption = "连接服务器" '改变caption
Shape1.BackColor = &H0& '控件显示为黑色,表示断开
'IsConnectionOpen = False
Winsock1.Close '关闭socks
End If
End Sub

Private Sub Command2_Click() '发送按钮,在处于连接状态的情况下,将发送

框的数据发送出去
If IsConnectionOpen = True Then
Winsock1.SendData Text3.Text
Else
MsgBox "未建立连接!"
End If '同服务器端一样
End Sub

Private Sub Command3_Click() '清空发送框数据
Text4.Text = ""
End Sub

Private Sub Command4_Click() '选择要保存的文件,随后收到的数据将写进这

个文件
On Error GoTo errhandler
CDia1.ShowOpen
Text5.Text = CDia1.FileName
Exit Sub
errhandler:
MsgBox "打开文件错误"
Exit Sub

End Sub

Private Sub Command5_Click() '清空接收数据
Text3.Text = ""
End Sub

Private Sub Command6_Click() '退出按钮
Winsock1.Close
Unload Me
End Sub

Private Sub Command7_Click() '接收完成后重置计数器,保证在不退出程序的

前提下,能够完整接收下一个
lenth = 0
i = 0
End Sub

Private Sub Form_Load() '装载程序
Form1.Left = (Screen.Width - Width) / 2
Form1.Top = (Screen.Height - Height) / 2
'Text1.Text = "127.0.0.1"
'Text2.Text = "7654" '程序启动时两个文本框先显示服务器的地址
'及端口号,无所谓,反正可以修改
Shape1.BackColor = &H0& '黑色 表示没有连接
IsConnectionOpen = False '一开始未联接
End Sub
Private Sub Text4_Change() '当接收框的显示达到一定长度,自动清空
If Len(Text4.Text) > 10000 Then
Text4.Text = ""
End If
End Sub

Private Sub Winsock1_Close() '关闭连接时
Winsock1.Close '关闭socks
Shape1.BackColor = &H0& '圆形shape显示为黑色
Command1.Caption = "连接服务器"
'IsConnectionOpen = False
'End '同服务器端一样
End Sub

Private Sub Winsock1_Connect() '联接成功时触发
IsConnectionOpen = True '给一个判断值,主要用于点击连接按钮
Shape1.BackColor = &HFF& '并且将shape显示为红色
'联接成功了
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '每当有数据

到达时
Dim str As String
Dim myFile() As Byte
Dim myLong As Double
Dim myPath As String


If Check1.Value = 0 Then '如果不选择保存到文件
Winsock1.GetData str '将接收的数据以字符串形式显示在接收显示框中
Text4.Text = Text4.Text & vbCrLf & str
'Text4.SelStart = Len(Text4.Text) '同服务器端一样
Else: 选择保存到文件的话
If Text5.Text <> "" Then ' 只要选择过保存的地址
ReDim myFile(0 To bytesTotal - 1)
ReadFileNo = FreeFile '分配一个不在使用中的文件号
Winsock1.GetData myFile '将接收的文件存进byte数组缓存
Open Trim(Text5.Text) For Binary As #ReadFileNo '打开要写进的文件
Put #ReadFileNo, lenth + 1, myFile '从标志位开始写进文件
Close #ReadFileNo '关闭文件
i = i + 1 '这个计数器主要用于后续扩展,暂时就是用于下面
Text4.Text = Text4.Text & vbCrLf & "已接收" & i & "块数据"
Winsock1.SendData "已接收" & i & "块数据"
lenth = lenth + UBound(myFile) - LBound(myFile) + 1 '标志位加上收

到的数据长度扩成新的标志位,用于下次写文件。(这也是为什么当整个文件收

完后,要对I和leng进行复位的原因)

End If
End If
End Sub
wosirius 2005-07-26
  • 打赏
  • 举报
回复
我写的 你看看吧 TCP/IP 协议


'服务器端
Option Explicit
Dim IsConnectionOpen As Boolean
Public ReadPos As Long '记录位置
Public ReadFileNo As Integer '读写文件号
Public Fleng As Long '长度
Public leng As Long

Private Sub Command1_Click()

Dim DSX() As Byte
Dim sT As String
Dim Psx(9) As Byte
Dim cs As Long
Dim i As Long
'以下Psx部分暂时未加功能,预留在这里留着做判断接收完成用。还打算在

这里加个协议,让客户端用来正确判断。
' Psx(0) = &H1
' Psx(1) = &H2
' Psx(2) = &H3
' Psx(3) = &H4
' Psx(4) = &H5
' Psx(5) = &H6
' Psx(6) = &H7
' Psx(7) = &H8
' Psx(8) = &H9
' Psx(9) = &HA

If IsConnectionOpen = False Then
MsgBox "未建立有效连接!" '如果未建立连接,就弹出这么一个对话框
Else
If Check1.Value = 0 Then '是否选择文件发送框,不选的话
Winsock1.SendData Text2.Text
'Socket就这么把发送框的数据发出去了,很简单
Else
If Text4.Text = "" Then '选择了check1之后,如果文件目录选择框

为空的话
MsgBox "请选择文件"
Else '选择了目录之后
Fleng = FileSystem.FileLen(Text4.Text) '读取文本框对应的文件

的长度
ReadPos = 1 '此处请见MSDN的帮助
ReadFileNo = 8
Close #ReadFileNo
Open Trim(Text4.Text) For Binary As #ReadFileNo


'以下代码为分割文件 text5.text为每个包的长度(byte)。text6为

发送延时(MS)。
leng = CLng(Text5.Text)
If Fleng > leng Then
ReDim DSX(leng - 1) As Byte
Timer1.Interval = CLng(Text6.Text)
Timer1.Enabled = True
Get #ReadFileNo, ReadPos, DSX()
Winsock1.SendData DSX()
Else
ReDim DSX(Fleng - 1) As Byte
Get #ReadFileNo, ReadPos, DSX()
Winsock1.SendData DSX()
Close #ReadFileNo
End If
'Winsock1.SendData Psx()
End If
End If
End If
End Sub

Private Sub Command2_Click() '清空发送框数据
Text1.Text = ""
End Sub

Private Sub Command3_Click() '清空接收框数据
Text2.Text = ""
End Sub

Private Sub Command4_Click() '选择要发送的文件(这里用了一个Common

Dialog控件)
On Error GoTo errhandler
CDia1.ShowOpen '选择打开一个文件
Text4.Text = CDia1.FileName '文件路径显示在TEXT4里面
Exit Sub
errhandler:
MsgBox "打开文件错误"
Exit Sub

End Sub

Private Sub Command5_Click() '重新侦听一个新的端口
Winsock1.Close '侦听之前先把原先的socks连接关闭
Winsock1.LocalPort = CLng(Text3.Text)
Winsock1.Listen
End Sub

Private Sub Command6_Click() '点退出,先关闭端口,在卸载。
'(建议用退出按钮,我懒得写UNLOAD,如果直接点关闭可能会导致端口不关闭


Winsock1.Close
Unload Me
End Sub

Private Sub Form_Load()
'装载的时候显示的位置
Form1.Left = (Screen.Width - Width) / 2
Form1.Top = (Screen.Height - Height) / 2

Winsock1.LocalPort = 7654 '程序默认的启动侦听端口
Winsock1.Listen 'Socket在程序启动时监听端口7654
Shape1.BackColor = &H0& '这个shape控件,用来显示连接状态,如果红色表

示连接成功,黑色表示连接断开
IsConnectionOpen = False '开始状态为未联接
End Sub



Private Sub Text1_Change() '当接收框的文本达到一定长度的时候自动清空
If Len(Text1.Text) > 9000 Then
Text1.Text = ""
End If
End Sub

Private Sub Timer1_Timer() '这个时钟控件的目的是为了能延时发送包(大体

功能是结合发送按钮,并且选择了复选框的时候)
Dim DSX() As Byte '为字节数组,用来存储读写内容
ReadPos = ReadPos + leng '定位发送文件中的偏移指针
If (Fleng - ReadPos) > leng Then
ReDim DSX(leng - 1) As Byte
Get #ReadFileNo, ReadPos, DSX()
Winsock1.SendData DSX()
Else
ReDim DSX(Fleng - ReadPos) As Byte
Get #ReadFileNo, ReadPos, DSX()
Winsock1.SendData DSX()
Close #ReadFileNo
Timer1.Enabled = False
End If
End Sub

Private Sub Winsock1_Close() '对方Socket关闭触发这个事件
Winsock1.Close '先关闭自己
IsConnectionOpen = False
Shape1.BackColor = &H0&
Winsock1.LocalPort = CLng(Text3.Text) '自动重新侦听原端口
Winsock1.Listen
Command5.Enabled = True '重新侦听按钮可用
End Sub

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long) '接收

到对方联接
'请求触发这个事件
If Winsock1.State <> sckClosed Then Winsock1.Close '使Socket在接收
'联接请求之前保持关闭状态

Winsock1.Accept requestID 'Winsock1自己接收联接请求,与客户端Socket
'建立联接
IsConnectionOpen = True
Shape1.BackColor = &HFF&
Command5.Enabled = False
'现在联接好了
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '收到数据触

发这个事件
Dim str As String

Winsock1.GetData str '收到数据时,Winsock1把数据写入缓存str
Text1.Text = Text1.Text & vbCrLf & str
'Text1.SelStart = Len(Text1.Text)
'在文本框中显示接收的数据
End Sub
zyg0 2005-07-25
  • 打赏
  • 举报
回复
winsock支持byte类型,
把msdn中的例子发送String类型变成 byte类型就行了

1,502

社区成员

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

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