想学习一下delphi中的api编程

解决方案 »

  1.   

    只要是DELPHI网络编程的书就有呀
      

  2.   

    一个用Socket API实现TCP的例子:
    {--------------------------------------------------------------
    Simple Example.
    Implement TCP(both Client and Server) with Socket API
    <[email protected]>
    --------------------------------------------------------------}unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      WinSock, StdCtrls;const
      WM_SOCK = WM_USER + 1;    //自定义windows消息
      TCP_PORT = 5432;          //设定TCP端口号type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        ListBox1: TListBox;
        procedure Button1Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        HasConnected, IsServer: boolean;
        CliSocket, SvrSocket: integer;
        SvrAddrIn, CliAddrIn:TSockAddrIn;
        procedure InitSocket;
        procedure SendData(Content: string);
        procedure ReadData(var Message: TMessage); message WM_SOCK;
        procedure SockConnect;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.InitSocket;
    var
      wsadata: TWsadata;
      err{, optval}: integer;
    begin  WSAStartup($0101,WSAData);
      
      CliSocket := socket(AF_INET, SOCK_STREAM,IPPROTO_IP);
      SvrSocket := socket(AF_INET, SOCK_STREAM,IPPROTO_IP);  if (CliSocket = INVALID_SOCKET)or(SvrSocket = INVALID_SOCKET) then
      begin
        ShowMessage(inttostr(WSAGetLastError())+'  Socket创建失败');
        CloseSocket(CliSocket);
        exit;
      end;  SvrAddrIn.sin_addr.s_addr:= INADDR_ANY;
      SvrAddrIn.sin_family := AF_INET;
      SvrAddrIn.sin_port :=htons(TCP_PORT);
      Bind(SvrSocket, SvrAddrIn, sizeof(SvrAddrIn));  err := Listen(SvrSocket,5);
      if err<>0 then ShowMessage('Listen error.');  {optval := 1;
      if SetSockopt(SvrSocket,SOL_SOCKET,SO_REUSEADDR,pchar(@optval),sizeof(optval)) = SOCKET_ERROR then
      begin
        showmessage('SO_REUSEADDR set error.');
      end; }  //绑定消息映射
      WSAAsyncSelect(SvrSocket, Handle , WM_SOCK, FD_READ or FD_ACCEPT or FD_CONNECT or FD_WRITE or FD_CLOSE);
      WSAAsyncSelect(CliSocket, Handle , WM_SOCK, FD_READ or FD_ACCEPT or FD_CONNECT or FD_WRITE or FD_CLOSE);end;procedure TForm1.SockConnect;
    var
      err: integer;
    begin  CliAddrIn.sin_addr.s_addr:=inet_addr(PChar(Edit1.Text));
      CliAddrIn.sin_family := AF_INET;
      CliAddrIn.sin_port :=htons(TCP_PORT);
      repeat
        err:=connect(CliSocket,CliAddrIn, SizeOf(CliAddrIn));
        if err = -1 then
        begin
          {  if we use WSAAsyncSelect(CliSocket...) in order to receive data at
             Client side, here will get error, but it still works. why?
          }
          //ShowMessage('connect error.');
          //ListBox1.Items.Add('connect error.');
          HasConnected := false;
          break;
        end
        else
        begin
          HasConnected := true;
          IsServer := false;
        end;
      until err=0;end;procedure TForm1.SendData(Content: string);
    begin
        Send(CliSocket,Content[1],length(Content),0);
    end;procedure TForm1.ReadData(var Message: TMessage);
    var
      Event: word;
      Buf:array[0..1023] of char;
      AddrLen, DataLen: integer;
    begin
      //
      AddrLen :=  sizeof(SvrAddrIn);
      Event := WSAGetSelectEvent(Message.LParam);  case Event of
        FD_CONNECT:
        begin
          ListBox1.Items.Add('connect');
          HasConnected := true;
          //do nothing?
        end;
        FD_ACCEPT:
        begin
          IsServer := true;
          HasConnected := true;
          ListBox1.Items.Add('accept');
          //CloseSocket(CliSocket);
          CliSocket := Accept(SvrSocket,@SvrAddrIn,@AddrLen);
        end;
        FD_READ:
        begin
          DataLen := Recv(CliSocket,Buf,1024,0);
          buf[DataLen] := #0;
          ListBox1.Items.Add(Buf);
        end;
        FD_WRITE:
        begin
          ListBox1.Items.Add('write');
        end;
        FD_OOB:
        begin
          ListBox1.Items.Add('FD_OOB');
        end;
        FD_CLOSE:
        begin
          HasConnected := false;
          ListBox1.Items.Add('close');
        end;
      end; //end of case
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      //202.104.32.230
      if (not IsServer)and(not HasConnected) then SockConnect;
      SendData('hello, world');
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      CloseSocket(SvrSocket);
      CloseSocket(CliSocket);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      HasConnected := false;
      IsServer := false;
      InitSocket;
    end;end.
      

  3.   

    UDP的例子:
    unit udp;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, winsock,
      StdCtrls;const
      WM_SOCK = WM_USER + 1;     //自定义windows消息
      UDPPORT = 646;            //设定UDP端口号type
      Tfrmmain = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Memo1: TMemo;
        Edit2: TEdit;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
        s: TSocket;
        addr: TSockAddr;
        FSockAddrIn : TSockAddrIn;
            //利用消息实时获知UDP消息
        procedure ReadData(var Message: TMessage);
                message WM_SOCK;
      public
        { Public declarations }
        procedure SendData(Content: String);
      end;var
      frmmain: Tfrmmain;implementation{$R *.DFM}procedure Tfrmmain.FormCreate(Sender: TObject);
    var
       TempWSAData: TWSAData;
       //optval: integer;
    begin
    // 初始化SOCKET
         if WSAStartup($101, TempWSAData)=1 then
            showmessage('StartUp Error!');     s := Socket(AF_INET, SOCK_DGRAM, 0);
         if (s = INVALID_SOCKET) then   //Socket创建失败
         begin
              showmessage(inttostr(WSAGetLastError())+'  Socket创建失败');
              CloseSocket(s);
    //          exit;
         end;
         //发送方SockAddr绑定
         addr.sin_family := AF_INET;
         addr.sin_addr.S_addr := INADDR_ANY;
         addr.sin_port := htons(UDPPORT);
         if Bind(s, addr, sizeof(addr)) <> 0  then
           begin
             showmessage('bind fail');
           end;
         {optval:= 1;
         if setsockopt(s,SOL_SOCKET,SO_BROADCAST,pchar(@optval),sizeof(optval)) = SOCKET_ERROR then
         begin
           showmessage('无法进行UDP广播');
         end;}
         WSAAsyncSelect(s, frmmain.Handle , WM_SOCK, FD_READ);
         //接收端SockAddrIn设定
         FSockAddrIn.SIn_Family := AF_INET;
         FSockAddrIn.SIn_Port := htons(UDPPORT);
         label3.Caption := '端口:'+inttostr(UDPPORT);
    end;procedure Tfrmmain.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
        CloseSocket(s);
    end;procedure Tfrmmain.ReadData(var Message: TMessage);
    var
       buffer: Array [1..4096] of char;
       len: integer;
       flen: integer;
       Event: word;
       value: string;
    begin
         flen:=sizeof(FSockAddrIn);
         FSockAddrIn.SIn_Port := htons(UDPPORT);
         Event := WSAGetSelectEvent(Message.LParam);
         if Event = FD_READ then
         begin
              len := recvfrom(s, buffer, sizeof(buffer), 0, FSockAddrIn, flen);
              value := copy(buffer, 1, len);
              Memo1.Lines.add(value)
         end;
    end;procedure Tfrmmain.SendData(Content: String);
    var
       value{,hostname}: string;
       len: integer;
    begin     FSockAddrIn.SIn_Addr.S_addr := inet_addr(pchar(Edit1.text)); //INADDR_BROADCAST;   //INADDR_BROADCAST = -1 ?
         value := Content;
         len := sendto(s, value[1], Length(value), 0, FSockAddrIn, sizeof(FSockAddrIn));
         if (WSAGetLastError() <> WSAEWOULDBLOCK) and (WSAGetLastError() <> 0) then
            showmessage(inttostr(WSAGetLastError()));
         if len = SOCKET_ERROR then
            showmessage('send fail');
         if len <> Length(value) then
            showmessage('Not Send all');
    end;procedure Tfrmmain.Button1Click(Sender: TObject);
    begin
         senddata(Edit2.text);
    end;end.
      

  4.   

    procedure TForm1.BitBtn1Click(Sender: TObject);
    var MyWSA:WSADATA ;
        Svr:Sockaddr_in;
        hSocket:TSOCKET;
        cbRead,cbWritten:integer;
        //NewEvent:WSAEVENT;
       // NetworkEvents:WSANETWORKEVENTS
    begin
      cbRead:=0;
      cbWritten:=0;
      If WSAStartup(MAKEWORD(2,2), MyWSA) <> 0 Then
      Begin
        WSACleanup;
        Exit;
      end;
      hSocket := Socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
      If hSocket = INVALID_SOCKET Then
      Begin
        WSACleanup;
        Exit;
      End;
      Svr.sin_family := AF_INET;
      Svr.sin_port := htons(strtoint(edit2.Text));
      Svr.sin_addr.S_addr := inet_addr(PChar(trim(edit1.Text)));
    if (not radiobutton8.Checked)   then
    begin
      if connect(hSocket, Svr, SizeOf(Svr))=SOCKET_ERROR  then
      begin
         memo1.Lines.Append('connect error!!');
         if closesocket(hSocket)<>0 then
         begin
           memo1.Lines.Append('Close Socket Error!');
           Exit ;
         end
         else
         begin
           memo1.Lines.Append('Close Socket Successed!!');
           Exit;
         end
      end
      else
      begin
        if( radiobutton1.Checked)   then
        begin
          CMessage[0]:='Q';
          CMessage[1]:='P';
          MessageLength:=2;
        end
        else
        if( radiobutton2.Checked)   then
        begin
          CMessage[0]:='Q';
          CMessage[1]:='C';
          MessageLength:=2;
        end
        else
        if( radiobutton3.Checked)   then
        begin
          GetSystemTime(SetTime);
          CMessage[0]:='T';
          CMessage[1]:=chr(SetTime.wYear div 100);
          CMessage[2]:=chr(SetTime.wYear mod 100);
          CMessage[3]:=chr(SetTime.wMonth);
          CMessage[4]:=chr(SetTime.wDay);
          CMessage[5]:=chr(SetTime.wDayOfWeek);
          CMessage[6]:=chr(SetTime.wHour);
          CMessage[7]:=chr(SetTime.wMinute);
          CMessage[8]:=chr(SetTime.wSecond);
          MessageLength:=9;
        end
        else
        if( radiobutton4.Checked)   then
        begin
          CMessage[0]:='R';
          MessageLength:=1;
        end
         else
        if( radiobutton5.Checked)   then
        begin
          CMessage[0]:='C';
          CMessage[1]:='O';
          CMessage[2]:='K';
          CMessage[3]:='o';
          CMessage[4]:='k';
          MessageLength:=5;
        end
         else
        if( radiobutton6.Checked)   then
        begin
          CMessage[0]:='H';
          MessageLength:=1;
        end
         else
        if( radiobutton7.Checked)   then
        begin
         CMessage[0]:='Q';
         CMessage[1]:='L';
         MessageLength:=2;
        end
        else
        begin
          CMessage[0]:='X';
          MessageLength:=1;
        end;
        StatusBar1.SimpleText:='发送命令!';
        cbWritten:=send(hsocket,CMessage,MessageLength,MSG_DONTROUTE);  
        memo1.Lines.Append('发送到路口端信息:'+trim(CMessage));
        CMessage:='\0';
      end;
      while(not((cbRead>0 )and (cbRead<50))) do
        begin
          cbRead:=recv(hsocket,chBuf,50,MSG_PEEK);
        end;
      //chBuf[cbRead]:='0';
      cbRead:=0;
      if((chBuf[0]='S') and (chBuf[1]='P') and radiobutton1.Checked)   then
      begin
        memo1.Lines.Append('欢迎使用闯红灯自动记录仪设备');
        memo1.Lines.Append('路口设备硬件自检......');
        //memo1.Lines.Append('内核电压   :'+ (single(chBuf[2])* 0.016).asstring +'V');
        memo1.Lines.Append('路口设备硬件自检......');
        memo1.Lines.Append('路口设备硬件自检......');
        memo1.Lines.Append('路口设备硬件自检......');
        memo1.Lines.Append('接收路口端信息:'+trim(chBuf));
      end
      else  if (not radiobutton8.Checked)  then
       memo1.Lines.Append('接收路口端信息:'+trim(chBuf));
       chBuf:='\0';
      shutdown(hSocket,SD_BOTH);
      GetSystemTime(OldTime);
      GetSystemTime(NewTime);
      while((NewTime.wSecond-OldTime.wSecond>Interval) or (OldTime.wSecond-NewTime.wSecond>NInterval)) do
      begin
        GetSystemTime(NewTime);
      end;
      closesocket(hsocket);
    end//if
    else
    memo1.Lines.Append('断开连接!');
    WSACleanup();end;