关于Socket发包中struct的格式转换问题,在线等

来源:百度知道 编辑:UC知道 时间:2024/09/21 15:52:24
情况是这样的:
对方是一个VC++写的Socket服务端,接收到包以后直接用定义好的Struct对象从内存中获取包中的数据。我简化了主要的代码如下:
//struct的定义
typedef struct DATA_SEND{
int aa
char bb[20];
}DATA_SEND;

//接收Socket包时
char RecvBuff[1024]={0};
int nRecvLen = recv(m_nSocket,RecvBuff,sizeof(DATA_SEND),0);

随后就直接开始引用RecvBuff->aa,RecvBuff->bb来进行操作。

现在我要用vb写一段程序作客户端向其发包,定义struct如下:
Public Type DATA_SEND
aa As Long
bb As String * 20
End Type

我的问题是:我该如何将这个struct转换成正确的格式,才能将其按正确的顺序使用winsock控件正确发送出去?

附我的发包代码:
Dim sendmessage As String
Dim info As SEND_DATA
with info
.aa = 12345
.bb = "12345"
end with

copymemory sendmessage, info, Len(info) '错误出在这一行

If Winsock1.State = sckConnected Then Winsock1.SendData(sendmessage)

copymemory sendmessage, info, Len(info) '错误出在这一行

1.这里需要具体错误信息才能判断``建议楼主采用Byte数组而不是字符串来发送包体``
2.vb到vc的数据传输有两个地方需要改动```
转换数字的高低位```用Wsock32.dll里的htnol函数``
字符串后面要加技术符```Chr(0)
3.Winsock发包后要加DoEvents````

声明接口````
Public Declare Function htonl Lib "Wsock32.dll" (ByVal hostlong As Long) As Long
Declare Sub copymemory Lib "kernel32" Alias "RtlMoveMemory" (Dest As Any, Source As Any, ByVal Length As Long)

代码```
Dim sdata() As Byte
Dim info As SEND_DATA
with info
.aa = htnol(12345)
.bb = "12345" & Chr(0)
end with
ReDim sdata(Len(info) - 1)
copymemory sdata(0), info, Len(info)
Winsock1.SendData sdata
DoEvents

我看不太懂楼主写的内容
楼主你好像是自己定义一个类型
然后把这个类型怎么处理一下变成字符串了
然后把这个字符串发送出去
你用的还是VB6好像

VB6太久没用也没研究过这方面的东西
总之VB.NET不是这样做的(至少我不是)
我的简单做法是这样的:
首先网络传输数据是传输二进制数据(BYTE)的
先把要传输的数据转换为二进制数据再进行传输