⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 udp.pas

📁 直接用Socket API实现UDP
💻 PAS
字号:
unit udp;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, winsock,
  StdCtrls;

const
  WM_SOCK = WM_USER + 1;     //自定义windows消息
  UDPPORT = 6767;            //设定UDP端口号

type
  Tfrmmain = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: 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);
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.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -