2013-01-10 16 views
0

我不断收到此错误:异步TCP套接字在C#不工作

"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 
     { 

     } 
    } 
+0

嘿安德鲁。尽量平滑 –

回答

1

你不应该有两个悬而未决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超载这需要缓冲区的列表。