zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    如何参与linux 内核开发
    绘制dot 图
    GITHUB 提交错误 Error: Permission denied (publickey) 解决
    atomic_read
    linux 获取cpu 个数
    【转】 管理CPU 亲和性
    【转】 申请对齐某种结构体大小的buffer
    WePY框架开发的小程序中使用 echarts折线图
    vue + css3 实现主题色切换
    vue 中 const { x } = this 的用法
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/5359706.html
Copyright © 2011-2022 走看看