关于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;       
      

解决方案 »

  1.   


    '问题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函数应该可以直接将二进制数据复制到结构体中还原结构记录