c#插座连接&;接收数据

c#插座连接&;接收数据,c#,sockets,tcp-ip,C#,Sockets,Tcp Ip,我有一个连接到插座的函数: public void Connect(string ip, ushort port) { try { m_clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); m_recv_buffer = new TransferBuffer(8192, 0, 0); m_localSec

我有一个连接到插座的函数:

public void Connect(string ip, ushort port)
{
    try
    {
        m_clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        m_recv_buffer = new TransferBuffer(8192, 0, 0);
        m_localSecurity = new Session(UsageMode.Client);

        IPEndPoint localEP = new IPEndPoint(IPAddress.Parse(ip), port);
        m_clientSocket.Connect(localEP);

        m_clientSocket.BeginReceive(m_recv_buffer.Buffer, 0, m_recv_buffer.Buffer.Length, SocketFlags.None, OnReceiveData, m_clientSocket);

    }
    catch (Exception ex)
    {
        if (ex.InnerException != null)
        {
            Debugger(string.Format("[ClientConnect] Socket Exception: {0}", ex.InnerException.Message), System.Drawing.Color.Gray);
        }
        else
        {
            Debugger(string.Format("[ClientConnect] Socket Exception: {0}", ex), System.Drawing.Color.Gray);
        }
    }
}
和接收数据的功能:

private void OnReceiveData(IAsyncResult ar)
        {
            Socket asyncState = (Socket)ar.AsyncState;

            if (asyncState.Connected)
            {
                try
                {
                    int readCount = asyncState.EndReceive(ar);
                    if (readCount > 0)
                    {
                        m_recv_buffer.Offset = 0;
                        m_recv_buffer.Size = readCount;
                        TransferBuffer buf = new TransferBuffer(m_recv_buffer.Buffer, 0, readCount, false);
                        m_localSecurity.Recv(buf);
                        Array.Clear(m_recv_buffer.Buffer, 0, m_recv_buffer.Buffer.Length);
                    }

                    asyncState.BeginReceive(m_recv_buffer.Buffer, 0, m_recv_buffer.Buffer.Length, SocketFlags.None, OnReceiveData, asyncState);
                }
                catch (SocketException sex)
                {
                    Debugger(string.Format("[OnReceiveData] Socket Exception: {0}", sex),System.Drawing.Color.Gray);
                }
                catch (Exception ex)
                {
                    Debugger(string.Format("[OnReceiveData] Exception: {0}", ex), System.Drawing.Color.Gray);
                }
            }
        }
在一些罕见的情况下,当我的互联网落后或处于不稳定状态时,我被困在一个
OnReceiveData
功能中。
Socket
连接并保持连接,但我没有收到服务器的任何响应,因此
OnReceiveData
函数正在调用它自己,并陷入循环中


有没有办法在接收数据部分时添加
超时
或任何其他检查?

您是否尝试过使用类似
AsyncWaitHandle.WaitOne()的方法查看以下解决方案


没有可以卡住的回路。。。如果在调试器中运行,并在执行“卡住”时暂停执行,它在哪一行?我个人从不使用回调函数。相反,我使用一个单独的线程。它使事情更容易控制。
TransferBuffer
是您自己的类吗?如果是的话,您可以包括您正在调用的构造函数的代码吗?@Brian Driscoll:asyncState.BeginReceive(m_recv_buffer.buffer,0,m_recv_buffer.buffer.Length,SocketFlags.None,OnReceiveData,asyncState);我已经尝试了5秒的超时时间。同样的问题。到套接字的连接看起来是可靠的。当你说“可靠”是发送套接字时,它实际上断开了连接。不,不是。套接字连接不是问题。问题是我没有从服务器得到任何响应。正在调用private void OnReceiveData(IAsyncResult ar)并且if(asyncState.Connected)始终为true,所以我继续执行if(readCount>0),而不是asyncState.BeginReceive(m_recv_buffer.buffer,0,m_recv_buffer.buffer.Length,SocketFlags.None,OnReceiveData,asyncState);被称为。。。而这个循环本身也在重复