简体   繁体   English

C#套接字连接并接收数据

[英]c# socket connect & receive data

I have a function that connects to a socket: 我有一个连接到套接字的函数:

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);
        }
    }
}

And function that is receiving data: 和接收数据的功能:

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);
                }
            }
        }

On some rare occasions when my internet is lagging or is in anyway unstable i am stuck in a OnReceiveData function. 在极少数情况下,当我的Internet出现滞后或不稳定时,我会陷入OnReceiveData函数中。 Socket connects and stays connected but I do not get any response from the server so OnReceiveData function is calling it self and gets stuck in a loop. Socket保持连接并保持连接状态,但是我没有从服务器得到任何响应,因此OnReceiveData函数自调用它并陷入循环中。

Is there a way to add a timeout or any other check on receiving data part? 有没有一种方法可以在接收数据部分添加timeout或任何其他检查?

Have you tried using something like AsyncWaitHandle.WaitOne(); 您是否尝试过使用类似AsyncWaitHandle.WaitOne(); take a look at the following solution 看看下面的解决方案

Implementation-of-Connecting-a-Socket-with-Timeout 超时连接套接字的实现

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM