您现在的位置:首页 >> 网络通讯 >> 网络通讯 >> 内容

Delphi用Socket IP/UDP局域网广播

时间:2011/9/3 15:13:29 点击:

  核心提示:A类互联网网址:7位网络号24位主机号 01111111.11111111.11111111.11111111---01111111=127 0..1270..2550..2550..255 0.0....

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;

作者:网络 来源:转载
相关文章
  • 没有相关文章
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 盒子文章(www.2ccc.com) © 2024 版权所有 All Rights Reserved.
  • 沪ICP备05001939号