想通过使用API函数来实现对设备/机器进行发送数据,并接收设备返回的数据(注:当对设备发送命令时,设备会自动作出应答,返回命令),
就象TIdUDPServer所实现的功能一样,
发送:
     TIdUDPServer.SendBuffer(DesIP,DesPort,Buf,bufSize);
接收:
     TIdUDPServer.OnUDPRead(Adata:TSTream....)
     begin
       直接读取Adata中的数据
       并进行操作。
     end;
希望大家把知道的告诉我,
都有分,
多谢大家。

解决方案 »

  1.   

    DatagramSocket 类可以实现你的要求
      

  2.   

    DatagramSocket 类?
    在哪里有,
    我要直接的API哦,
      

  3.   

    WINSOCK API,
    我是想知道用哪些WINSOCK API,
    知道的富翁请写下来,并请配点例子语句,
    如发送数据为:40 40 40 40 01 fb 05 00 00 00 00 21 00 01 00 00 23
    马上给分,
      

  4.   

    WM_AlarmSOCK = WM_USER + 1;    //自定义Windows Socket 消息//利用消息实时获知UDP消息
        procedure ReadAlarmData(var Message: TMessage); message WM_AlarmSOCK; 
       AlarmSocket: TSocket;
        AlarmUDPADDR: string;
        AlarmUDPPORT: Integer;
        AlarmSockAddr: TSockAddr;
        AlarmSockAddrIn: TSockAddrIn;//同步报警
    procedure TfrmDP.actAlarmExecute(Sender: TObject);
    var ini: TIniFile;
    begin
      TAction(Sender).Checked := not TAction(Sender).Checked;  if TAction(Sender).Checked then
      begin
        try
          ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Config.INI');
          AlarmUDPADDR := ini.ReadString('SERVER', 'AlarmRemoteHost', 'localhost');
          AlarmUDPPORT := ini.ReadInteger('SERVER', 'AlarmPort', 5005);
          ini.Free;      TAction(Sender).Checked := CreateAlarmSocket;
        except
          on E: Exception do MessageDlg('Error while connecting:' + #13 + E.Message, mtError, [mbOK], 0);
        end;
      end
      else
      begin
        CloseAlarmSocket(AlarmSocket);
      end;
    end;function TfrmDP.CreateAlarmSocket: Boolean;
    var TempWSAData: TWSAData;
    begin
      if WSAStartup($101, TempWSAData)=1 then
      begin
        MessageBox(Application.Handle, '启动报警Socket失败', '报警Socket', MB_ICONINFORMATION + MB_OK);
      end;  AlarmSocket := Socket(AF_INET, SOCK_DGRAM, 0);
      if (AlarmSocket = INVALID_SOCKET) then  //Socket创建失败
      begin
        MessageBox(Application.Handle, PChar(IntToStr(WSAGetLastError()) + ' Socket创建失败'), '报警Socket', MB_ICONINFORMATION + MB_OK);
        CloseAlarmSocket(AlarmSocket);
        Result := False;
        Exit;
      end;
      //发送方SockAddr绑定
      AlarmSockAddr.sin_family := AF_INET;
      AlarmSockAddr.sin_addr.S_addr := INADDR_ANY;
      AlarmSockAddr.sin_port := htons(AlarmUDPPORT);  if Bind(AlarmSocket, AlarmSockAddr, SizeOf(AlarmSockAddr)) <> 0 then
      begin
        MessageBox(Application.Handle, '绑定失败', '报警Socket', MB_ICONINFORMATION + MB_OK);
        Result := False;
        Exit;
      end;
      WSAAsyncSelect(AlarmSocket, {Application.Handle}frmDP.Handle, WM_AlarmSOCK, FD_READ);   // 不能使用Applicaton.Handle, 因为它不能响应Socket消息
      //接收端SocketAddrIn设定
      AlarmSockAddrIn.SIn_Family := AF_INET;
      AlarmSockAddrIn.SIn_Port := htons(AlarmUDPPORT);
      Result := True;
    end;procedure TfrmDP.CloseAlarmSocket;
    begin
      CloseSocket(AlarmSocket);
    end;procedure TfrmDP.DisposeAlarmData(Content: string);
    var strType, strDate, strTime, strSource, strSort, strEvent, strUser: string;
      I: Integer;
    begin
      I := Pos(',', Content);
      if I>0 then
      begin
        strDate := Copy(Content, 1, Pos(' ', Content)-1);
        strTime := Copy(Content, Pos(' ', Content)+1, I-1 - Pos(' ', Content));
        Delete(Content, 1, I);
      end;  I := Pos(',', Content);
      if I>0 then
      begin
        strSource := Copy(Content, 1, I-1);
        Delete(Content, 1, I);
      end;  I := Pos(',', Content);
      if I>0 then
      begin
        strSort := Copy(Content, 1, I-1);
        Delete(Content, 1, I);
      end;
      {
      I := Pos(',', Content);
      if I>0 then
      begin
        strUser := Copy(Content, 1, I-1);
        Delete(Content, 1, I);
      end;
      }
      strUser := '监控中心';
      
      if Length(Content) > 0 then
      begin
        strEvent := Content;
      end;  {
      I := Pos(',', Content);
      if I>0 then
      begin
        strSource := Copy(Content, 1, I-1);
        Delete(Content, 1, I);
      end;
      }  lvAlarmInfo.Items.BeginUpdate;
      with lvAlarmInfo.Items.Add do
      begin
        Caption := '报警';
        ImageIndex := 2;    SubItems.Add(strDate);
        SubItems.Add(strTime);
        SubItems.Add(strSource);
        SubItems.Add(strSort);
        SubItems.Add(strEvent);
        SubItems.Add(strUser);
      end;
      lvAlarmInfo.Items.EndUpdate;
    end;procedure TfrmDP.ReadAlarmData(var Message: TMessage);
    var
      Buffer: array[1..4096] of char;
      len: Integer;
      flen: Integer;
      Event: Word;
      value: string;
    begin
      flen := Sizeof(AlarmSockAddrIn);;
      AlarmSockAddrIn.SIn_Port := htons(AlarmUDPPORT);
      Event := WSAGetSelectEvent(Message.LParam);
      if Event = FD_READ then
      begin
        len := RecvFrom(AlarmSocket, Buffer, Sizeof(Buffer), 0, AlarmSockAddrIn, flen);
        value := Copy(Buffer, 1, len);
        DisposeAlarmData(value);
      end;
    end;procedure TfrmDP.SendAlarmData(Content: string);
    var
      value: string;
      len: Integer;
    begin
      AlarmSockAddrIn.sin_addr.S_addr := inet_addr(PChar(AlarmUDPADDR));   //INADDR_BROADCAST;
      value := Content;
      len := SendTo(AlarmSocket, value[1], Length(value), 0, AlarmSockAddrIn, SizeOf(AlarmSockAddrIn));
      if (WSAGetLastError() <> WSAEWOULDBLOCK) and (WSAGetLastError() <> 0) then
        MessageBox(Application.Handle, PChar(IntToStr(WSAGetLastError()) + '报警Socket发送数据'), '报警Socket', MB_ICONINFORMATION + MB_OK);  if len = SOCKET_ERROR then
        MessageBox(Application.Handle, '报警Socket发送数据失败', '报警Socket', MB_ICONERROR + MB_OK);  if len <> Length(value) then
        MessageBox(Application.Handle, '报警Socket发送数据中断', '报警Socket', MB_ICONERROR + MB_OK);end;
    这些代码很完整,应该可以给你参考了
      

  5.   

    网上搜索一下Winsock 2.0 文档说明吧