• Delphi用Socket IP/UDP局域网广播


    A类互联网网址: 7位网络号          24位主机号
                  01111111.11111111.11111111.11111111 --->01111111 = 127
                   0..127  0..255   0..255   0..255
                   0.0.0.0 -- 127.255.255.255
    B类互联网网址: 14位网络号          16位主机号
                  10111111.11111111.11111111.11111111 --->10111111 = 191
                   128..191  0..255   0..255   0..255
                   128.0.0.0 -- 191.255.255.255
    C类互联网网址: 21位网络号          8位主机号
                  11011111.11111111.11111111.11111111 --->11011111 = 223
                   192..223  0..255   0..255   0..255
                   192.0.0.0 -- 223.255.255.255
    多播地址: 224.0.0.0 -- 255.255.255.255

    const  
      MCASTADDR     = ‘234.5.6.7’;  
      MCASTPORT     = 25000;  
      LOCAL_PORT    = 5555;  
      WM_SOCKET     = WM_USER + 55;  
    type  
      TForm1 = class(TForm)  
        Button1: TButton;  
        Edit1: TEdit;  
        ListBox1: TListBox;  
        CheckBox1: TCheckBox;  
        procedure FormCreate(Sender: TObject);      
        procedure Button1Click(Sender: TObject);  
        procedure FormClose(Sender: TObject; var Action: TCloseAction);  
      private  
        { Private declarations }  
        procedure WMSocket(var Msg: TMessage); message WM_SOCKET;  
      public  
        { Public declarations }  
      end;  
    var  
      Form1: TForm1;  
    implementation  
    {$R *.dfm}  
    procedure ErrMsg( msg: string );  
    begin  
      MessageBox( 0, PChar(msg), ‘Ping Program Error’, MB_ICONERROR );  
    end;  
    procedure TForm1.WMSocket(var Msg: TMessage);  
    var  
      buf:array[0..255]of char;  
      remote:TSockaddr;  
      len:integer;   p:string;  
    begin  
      case WSAGetSelectEvent( Msg.LParam ) of  
        FD_READ :  
        begin  
          recvfrom(msg.WParam, buf[0], 255,0, remote, len );  
          getpeername(  msg.WParam, remote, len );  
          p :=  inet_ntoa(remote.sin_addr) + ‘Port: ’ + inttostr(ntohs(remote.sin_port));  
          listbox1.Items.Add(p + buf);  
        end;  
      end;  
    end;  
    procedure TForm1.FormCreate(Sender: TObject);  
    var  
      wsa : TWSAData;  
    begin  
      if WSAStartup( $0202, wsa ) <> 0 then  
         ErrMsg( ‘Windows socket is not responed.’);  
      listbox1.Font.Name := ‘Courier New’;  
      listbox1.Font.Size := 9;  
    end;  
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);  
    begin  
      if WSACleanup <> 0 then  
         ErrMsg( ‘Windows socket can not be closed.’ );  
    end;  
    procedure TForm1.Button1Click(Sender: TObject);  
    var  
      sock : TSocket;  
      local,  
      remote    : TSockAddr;  
      bufsend  : Array[0..31]of char;  
      ret,i      : s32;  
      ttl, opt : s32;  
      bSender :bool;  
      mcast   :ip_mreq;  
    begin  
      bSender := CheckBox1.Checked;  
      sock := socket( AF_INET, SOCK_DGRAM, 0 );  
      if sock = INVALID_SOCKET then  
      begin  
        ErrMsg( ‘socket Failed: ’ + IntToStr(WSAGetLastError) );  
        exit;  
      end;  
      local.sin_family := AF_INET;  
      local.sin_port := htons(u16(MCASTPort));  
      local.sin_addr.S_addr := inet_addr(‘192.168.1.12’);  
      //  
      if bind( sock, @local, SizeOf(local) )= SOCKET_ERROR then  
      begin  
        ErrMsg( ‘bind Failed: ’ + IntToStr(WSAGetLastError) );  
        closesocket(sock);  
        exit;  
      end;  
      if WSAAsyncSelect( sock, Handle, WM_SOCKET, FD_READ ) = socket_error then  
      begin  
        ErrMsg( ‘WSAAsyncSelect Failed: ’ + IntToStr(WSAGetLastError) );  
        closesocket(sock);  
        exit;  
      end;  
      remote.sin_family := AF_INET;  
      remote.sin_port := htons( MCASTPort );  
      remote.sin_addr.S_addr := inet_addr(MCASTADDR);  
      mcast.imr_multiaddr.S_addr := remote.sin_addr.S_addr;  
      mcast.imr_interface.S_addr := local.sin_addr.S_addr;  
      if setsockopt( sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, @mcast, sizeof(mcast) )=SOCKET_ERROR then  
      begin  
        ErrMsg( ‘setsockopt Failed: ’ + IntToStr(WSAGetLastError) );  
        closesocket(sock);  
        exit;  
      end;  
      Opt := 8;  
      if setsockopt( sock, IPPROTO_IP, IP_MULTICAST_TTL, @opt, sizeof(opt) )=SOCKET_ERROR then  
      begin  
        ErrMsg( ‘setsockopt Failed: ’ + IntToStr(WSAGetLastError) );  
        closesocket(sock);  
        exit;  
      end;  
      //要发送的UDP数据
      FillChar( bufSend, 32, ‘C’ );  
      if bSender then  for i:=0 to 3 do  
      begin  
        ret :=sendto( sock, bufsend[0], 32, 0, remote, sizeof(remote));  
        if ret =socket_error then  
        begin  
          ErrMsg( ‘sendto Failed: ’ + IntToStr(WSAGetLastError) );  
          //closesocket(sock);  
          break;  
        end;  
      end;  
      //closesocket( sock );  
     // closesocket(sockm);  
    end;   
  • 相关阅读:
    关于我对区块链和比特币的看法
    叙Windows平台下基于MBR和UEFI的bootkit(一)--以MBR为例
    动若脱兔:深入浅出angr--初步理解符号执行以及angr架构
    面经
    倚天屠龙(一):妙用IDA Pro--利用IDAPython编写调试插件
    初生牛犊:Windows下Anti-sandboxes技术探究
    浮生半日:探究Python字节码
    抽丝剥茧:理解Android权限机制
    自古套路得人心:安全岗面经(人生苦短,请勿入坑二进制)
    点击按钮,复制微信号代码
  • 原文地址:https://www.cnblogs.com/railgunman/p/1889735.html
Copyright © 2020-2023  润新知