关于VB WINSOCK通讯,请高手指导一下,若能给出原代码可以支付一点辛苦费,谢谢!
通讯协议下载地址:www.io89.com/a5.pdf
要求:能正确接收指纹数据即可
我的QQ:6334164, MSN:[email protected], 手机:13138890525type
TFPUSTRU = packed record//tcp/ip回送结构
uno: cardinal;//用户号码 4 byte
uname: Array[1..10] of char; //姓名 10 byte
udepname: Array[1..10] of char;// 部门 10 byte
end; TFPIdentify = packed record//指纹验证识别
MachineNumber: Byte;
PIN: Cardinal;
ImageSize: Cardinal;
end; TFPResult= packed record//pc回送结果
PIN: Cardinal;
uname: Array[1..20] of char; //姓名 20 byte
udepname: Array[1..20] of char;// 部门 20 byte
end;
//UDP收到“REQ”后立即回发“OK”,VB中使用WINSOCK控件,能收到REQ,但发送OK没反应。UDP PORT=4371
procedure TFrmMain.UDPServerUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
DataStringStream: TStringStream;
s: String;
begin
DataStringStream := TStringStream.Create('');
try
DataStringStream.CopyFrom(AData, AData.Size);
if datastringStream.DataString = 'REQ' then
begin
s := 'OK';
ABinding.SendTo(ABinding.PeerIP, StrToInt(g_udpport), s[1], Length(s)); //关键是在这里不知道VB怎样发送,我用VB的WINSOCK控件发,但没有反应。
end;
finally
DataStringStream.Free;
end;
end;procedure TFrmMain.IdTCPServerExecute(AThread: TIdPeerThread);
var
//省去了变量声明
begin
try
try
with AThread do
begin
//开始接收数据
TempStream := TMemoryStream.Create;
connection.ReadStream(tempstream, 4);
tempstream.Position := 0;
tempstream.ReadBuffer(size, 4);
tempstream.Free;
//待接收数据大小
size1 := size;
if (Size > 0) then
begin
TempStream := TMemoryStream.Create;
connection.ReadStream(tempstream, 2);
tempstream.Position := 0;
tempstream.ReadBuffer(rvcommand, 2);
Tempstream.Free;
//显示命令请求
rvcommand1 := rvcommand;
if rvcommand < 7 then
postmessage(FrmMain.handle, WM_dispstart, 2,0);
case rvcommand of
1: begin //收到验证命令
TempStream := TMemoryStream.Create;
try
connection.ReadStream(tempstream, sizeof(fpvfstru));
tempstream.Position := 0;
tempstream.ReadBuffer(fpvfstru, sizeof(fpvfstru)); //关键这里不知道在VB怎么写,将接收到二进制数据转换为结构
finally
Tempstream.Free;
end;
通讯协议下载地址:www.io89.com/a5.pdf
要求:能正确接收指纹数据即可
我的QQ:6334164, MSN:[email protected], 手机:13138890525type
TFPUSTRU = packed record//tcp/ip回送结构
uno: cardinal;//用户号码 4 byte
uname: Array[1..10] of char; //姓名 10 byte
udepname: Array[1..10] of char;// 部门 10 byte
end; TFPIdentify = packed record//指纹验证识别
MachineNumber: Byte;
PIN: Cardinal;
ImageSize: Cardinal;
end; TFPResult= packed record//pc回送结果
PIN: Cardinal;
uname: Array[1..20] of char; //姓名 20 byte
udepname: Array[1..20] of char;// 部门 20 byte
end;
//UDP收到“REQ”后立即回发“OK”,VB中使用WINSOCK控件,能收到REQ,但发送OK没反应。UDP PORT=4371
procedure TFrmMain.UDPServerUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
DataStringStream: TStringStream;
s: String;
begin
DataStringStream := TStringStream.Create('');
try
DataStringStream.CopyFrom(AData, AData.Size);
if datastringStream.DataString = 'REQ' then
begin
s := 'OK';
ABinding.SendTo(ABinding.PeerIP, StrToInt(g_udpport), s[1], Length(s)); //关键是在这里不知道VB怎样发送,我用VB的WINSOCK控件发,但没有反应。
end;
finally
DataStringStream.Free;
end;
end;procedure TFrmMain.IdTCPServerExecute(AThread: TIdPeerThread);
var
//省去了变量声明
begin
try
try
with AThread do
begin
//开始接收数据
TempStream := TMemoryStream.Create;
connection.ReadStream(tempstream, 4);
tempstream.Position := 0;
tempstream.ReadBuffer(size, 4);
tempstream.Free;
//待接收数据大小
size1 := size;
if (Size > 0) then
begin
TempStream := TMemoryStream.Create;
connection.ReadStream(tempstream, 2);
tempstream.Position := 0;
tempstream.ReadBuffer(rvcommand, 2);
Tempstream.Free;
//显示命令请求
rvcommand1 := rvcommand;
if rvcommand < 7 then
postmessage(FrmMain.handle, WM_dispstart, 2,0);
case rvcommand of
1: begin //收到验证命令
TempStream := TMemoryStream.Create;
try
connection.ReadStream(tempstream, sizeof(fpvfstru));
tempstream.Position := 0;
tempstream.ReadBuffer(fpvfstru, sizeof(fpvfstru)); //关键这里不知道在VB怎么写,将接收到二进制数据转换为结构
finally
Tempstream.Free;
end;
'问题1: ABinding.SendTo(ABinding.PeerIP, StrToInt(g_udpport), s[1], Length(s)); //关键是在这里不知道VB怎样发送,我用VB的WINSOCK
' 控件发,但没有反应。
'可能是由于WinSock没有绑定好造成的,检查一下LocalPort, RemoteHost, RemotePort, Bind代码是否正常工作Private Sub cmdSendREQ_Click()
wsLeft.SendData "REQ"
End SubPrivate Sub Form_Load()
Call InitWS
End Sub
Private Sub InitWS()
'初始化两个WinSock控件,模拟信号源的两端
With wsLeft
.Protocol = sckUDPProtocol
.LocalPort = 4371
.RemoteHost = "127.0.0.1"
.RemotePort = 4372
.Bind
End With
With wsRight
.Protocol = sckUDPProtocol
.LocalPort = 4372
.RemoteHost = "127.0.0.1"
.RemotePort = 4371
.Bind
End With
End SubPrivate Sub wsLeft_DataArrival(ByVal bytesTotal As Long)
Dim strR As String
wsLeft.GetData strR, vbString '获得数据
txtLeft.Text = txtLeft.Text & "Recive: " & strR & vbCrLf
End SubPrivate Sub wsRight_DataArrival(ByVal bytesTotal As Long)
Dim strR As String
wsRight.GetData strR, vbString
txtRight.Text = txtRight.Text & "Recive: " & strR & vbCrLf
If strR = "REQ" Then
wsRight.SendData "OK" '发送数据
End If
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
TFPUSTRU = packed record//tcp/ip回送结构
uno: cardinal;//用户号码 4 byte
uname: Array[1..10] of char; //姓名 10 byte
udepname: Array[1..10] of char;// 部门 10 byte
end; Private Type TFPUSTRU
uno As Long ' VB下Long是4字节的
uname As String * 10 '10字节长度的字符串
udepname As String * 10
End Type利用CopyMemory函数应该可以直接将二进制数据复制到结构体中还原结构记录