Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步TCP套接字在C中不工作#_C#_Sockets_Networking_Asynchronous_Tcp - Fatal编程技术网

C# 异步TCP套接字在C中不工作#

C# 异步TCP套接字在C中不工作#,c#,sockets,networking,asynchronous,tcp,C#,Sockets,Networking,Asynchronous,Tcp,我不断地发现这个错误: "The IAsyncResult object was not returned from the corresponding asynchonous method on this class. Parameter name : aysncResult. Line 105. 当我尝试连接到本地服务器时会发生这种情况;它出错,无法连接 这是我的客户代码: public class Client { public delegate void OnConnectE

我不断地发现这个错误:

"The IAsyncResult object was not returned from the corresponding asynchonous method on this class. Parameter name : aysncResult. Line 105.
当我尝试连接到本地服务器时会发生这种情况;它出错,无法连接

这是我的客户代码:

public class Client
{

    public delegate void OnConnectEventHandler(Client sender, bool connected);
    public event OnConnectEventHandler OnConnect;

    public delegate void OnSendEventHandler(Client sender, int sent);
    public event OnSendEventHandler OnSend;

    public delegate void OnDisconnectEventHandler(Client sender);
    public event OnDisconnectEventHandler OnDisconnect;

    Socket socket;

    public bool Connected
    {
        get
        {
            if (socket != null)
            {
                return socket.Connected;
            }

            return false;
        }
    }

    public Client()
    {
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    }

    public void SendData()
    {

    }

    public void Connect(string IP, int port)
    {
        if (socket == null)
        {
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        }

        socket.BeginConnect(IP, port, new AsyncCallback(sendCallback), null);


    }

    private void connectCallback(IAsyncResult ar)
    {
        //try
        //{
            socket.EndConnect(ar);

            if (OnConnect != null)
            {
                OnConnect(this, Connected);
            }
        //}
        //catch
        //{

        //}
    }

    public void Send(byte[] data, int index, int length)
    {
        socket.BeginSend(BitConverter.GetBytes(length), 0, 4, SocketFlags.None, new AsyncCallback(sendCallback), null);
        socket.BeginSend(data, index, length, SocketFlags.None, new AsyncCallback(sendCallback), null);
    }

    private void sendCallback(IAsyncResult ar)
    {
        try
        {
            int sent = socket.EndSend(ar); ( errrors here )

            if (OnSend != null)
            {
                OnSend(this, sent);
            }
        }
        catch (Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.ToString());
            return;
        }
    }

    public void Disconnect()
    {
        try
        {
            if (socket.Connected)
            {
                socket.Close();
                socket = null;
                if (OnDisconnect != null)
                {
                    OnDisconnect(this);
                }
            }
        }
        catch
        {

        }
    }

您不应该有两个挂起的
BeginSend
操作

发送大小,然后在完成时发送缓冲区:

public void Send(byte[] data, int index, int length)
{
    //add data as state
    socket.BeginSend(BitConverter.GetBytes(length), 0, 4, SocketFlags.None, sendCallback, data);
}

private void sendCallback(IAsyncResult ar)
{
    try
    {
        int sent = socket.EndSend(ar); ( errrors here )

        // check if data was attached.
        if (ar.AsyncState != null)
        {
            byte[] buffer = (byte[])ar.AsyncState;
            socket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, sendCallback, null);
            return;
        }

        if (OnSend != null)
        {
            OnSend(this, sent);
        }
    }
    catch (Exception ex)
    {
        System.Windows.Forms.MessageBox.Show(ex.ToString());
        return;
    }
}

您还可以使用
BeginSend
重载,该重载获取缓冲区列表。

hey andrew。试着把它弄光滑