• DELPHI异步选择模型UDP


    unit U_FrmServer;

    interface

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

    const
    WM_WINSOCK_ASYNC_MSG = WM_USER + 123;

    type
    TTestServer = class(TComponent)
    private
    FWindow: HWND;
    FServerSocket: TSocket;
    protected
    procedure WndProc(var Msg: TMessage);
    public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure OpenServer;
    end;

    TfrmServer = class(TForm)
    btnOpenServer: TButton;
    procedure btnOpenServerClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    private
    { Private declarations }
    FServer: TTestServer;
    public
    { Public declarations }
    end;

    var
    frmServer: TfrmServer;
    WSData: TWSAData;

    implementation

    {$R *.DFM}

    { TTestServer }

    constructor TTestServer.Create(AOwner: TComponent);
    begin
    inherited;
    FWindow := INVALID_HANDLE_VALUE;
    FServerSocket := INVALID_SOCKET;
    end;

    destructor TTestServer.Destroy;
    begin
    DeallocateHWnd(FWindow);
    closesocket(FServerSocket);
    inherited;
    end;

    procedure TTestServer.OpenServer;
    var
    addr: TSockAddrIn;
    begin
    if FWindow = INVALID_HANDLE_VALUE then
    FWindow := AllocateHWnd(WndProc);

    FServerSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_UDP);
    addr.sin_family := AF_INET;
    addr.sin_addr.S_addr := INADDR_ANY;
    addr.sin_port := htons(9876);

    bind(FServerSocket, addr, SizeOf(addr));

    WSAAsyncSelect(FServerSocket, FWindow, WM_WINSOCK_ASYNC_MSG, FD_READ or FD_WRITE);
    end;

    procedure TTestServer.WndProc(var Msg: TMessage);
    var
    sEvent: TSocket;
    nRecv: Integer;
    sRecv: string;
    begin
    if Msg.Msg <> WM_WINSOCK_ASYNC_MSG then
    begin
    Msg.Result := DefWindowProc(FWindow, Msg.Msg, Msg.WParam, Msg.LParam);
    Exit;
    end;


    //取得有事件发生的套接字
    sEvent := Msg.WParam;
    if WSAGetSelectError(Msg.lParam) <> 0 then
    begin
    closesocket(sEvent);
    exit;
    end;


    //处理发生的事件
    case WSAGetSelectEvent(Msg.lParam) of
    FD_WRITE:
    begin

    end;
    FD_READ:
    begin
    SetLength(sRecv, 1024);
    nRecv := recv(sEvent, sRecv[1], 1024, 0);
    if nRecv = -1 then
    closesocket(sEvent)
    else
    begin
    SetLength(sRecv, nRecv);
    ShowMessage(sRecv);
    end;
    end;
    end;
    end;

    procedure TfrmServer.btnOpenServerClick(Sender: TObject);
    begin
    FServer := TTestServer.Create(Self);
    FServer.OpenServer;
    end;

    procedure TfrmServer.FormDestroy(Sender: TObject);
    begin
    FServer.Free;
    end;

    initialization
    WSAStartup($0202, WSData);

    finalization
    WSACleanup;

    end.

  • 相关阅读:
    PHP: 深入pack/unpack
    gitlab add sshkey(包括第二个key)
    mysql insert与replace 性能
    python3 构造数据
    python 中matplotlib 绘图
    Anaconda安装方法
    永久解决IDEA 连接 mysql时区问题`
    输入3个字符串,按从小到大的顺序输出。要求使用指针的方法进行处理。
    给定字符串定义char *a = “I love China!”,读入整数n,输出在进行了a = a + n这个赋值操作以后字符指针a对应的字符串
    输入a、b、c三个整数,按先大后小的顺序输出a、b和c。注意请使用指针变量的方式进行比较和输出。
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/5359706.html
Copyright © 2020-2023  润新知