本文介绍了如何调用和在C#中使用WSAAsyncSelect()?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我编辑我的问题,当我设定的赏金。
我想从WinAPI的调用/的DllImport WSAAsyncSelect(),并使用它就像我用它在Delphi / C ++

I edited my question when I set the bounty.I want to Invoke/DllImport WSAAsyncSelect() from WinAPI and use it much like I use it in Delphi/C++

例如 - 德尔福

//Async CallBack handler Declaration
procedure MessageHandler(var Msg:Tmessage);Message WM_WINSOCK_ASYNC_MSG;

//Where i setup the Async
dwError := WSAAsyncSelect(Sock, form1.handle, WM_WINSOCK_ASYNC_MSG, FD_CLOSE or FD_READ);

//Async Callback Handler
procedure Tform1.MessageHandler(var Msg:Tmessage);
begin
  case WSAGetSelectEvent(MSG.LParam) of //LParam is FD_READ/FR_CLOSE/FD_WRITE
    FD_READ: OnSocketRead(MSG.WParam); //WPARAM is the Socket itself.
    FD_CLOSE: OnSocketClose(MSG.WParam);
  end;
end;

在此先感谢!

推荐答案

我成功了! Finaly!

I made it! Finaly!!!

WSAAsyncSelect()结构

WSAAsyncSelect() structure

    [DllImport("wsock32.dll")]
    public static extern int WSAAsyncSelect(
    int socket,
    int hWnd,
    int wMsg,
    int lEvent
    );

WS2类

public class WS2
{
    public static Socket sock;
    public static byte[] data = new byte[8096];
    public static int server = 0;
    public static bool forced = true;

    public static void Close()
    {
        //Extern.closesocket(sock.Handle.ToInt32());
        //Extern.WSACleanup();

        sock.Shutdown(SocketShutdown.Both);
        sock.Close();

        if (forced)
        {
            Connect();
        }
    }
    public static void ConnectTo(string ip,int port)
    {
        sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        sock.Connect(ip, port);

        int handle = 0;
        var form1 = Form.ActiveForm as FormMain;
        if (form1 != null)
            handle = form1.GetHandle;
        if (handle == 0)
        {
            FormMain.PerformActionOnMainForm(form => form.memo.Text += "An error occured: Error code WS_01_ASYNC_HANDLE");
            return;
        }
        Extern.WSAAsyncSelect(sock.Handle.ToInt32(), handle, Values.MESSAGE_ASYNC, Values.FD_READ | Values.FD_CLOSE);
    }

    public static void Connect()
    {
        //Get IP && port
        string ip = GetIPFromHost("gwgt1.joymax.com");
        if (ip == "")
        {
            ip = GetIPFromHost("gwgt2.joymax.com");
            if (ip == "")
            {
            }
            server +=2;
        }
        else
            server +=1;

        int port = 15779;

        //
        ConnectTo(ip, port);
    }

    public static void Receive()
    {
        int size = sock.Receive(data);
        if (size == 0)
        {
            FormMain.PerformActionOnMainForm(form => form.memo.Text += "An error occured: Error Code WS_02_RECV_BEGN");
        }

        Main.Handle(data, size);
    }

    public static string GetIPFromHost(string HostName)
    {
        IPHostEntry ip;
        try
        {
            ip = Dns.GetHostEntry(HostName);
        }
        catch (Exception)
        {
            return "";
        }
        return ip.AddressList[0].ToString();
    }
}

在的WndProc Form类。

WndProc in the Form class.

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == Values.MESSAGE_ASYNC)
        {

            switch (m.LParam.ToInt32())
            {
                case Values.FD_READ:
                    WS2.Receive();
                    break;
                case Values.FD_WRITE: break;
                case Values.FD_CLOSE:
                    WS2.Close();
                    break;
                default: break;
            }

        }
        else
        {
            base.WndProc(ref m);
        }
    }

获取处理:

    public int GetHandle
    {
        get
        {
            if (this.InvokeRequired)
            {
                return (int)this.Invoke((GetHandleDelegate)delegate
                {
                    return this.Handle.ToInt32();
                });
            }
            return this.Handle.ToInt32();
        }
    }
    private delegate int GetHandleDelegate();

这篇关于如何调用和在C#中使用WSAAsyncSelect()?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-03 04:05