为什么BeginReceive()不会返回多个读取?

时间:2015-01-04 23:24:39

标签: c# multithreading sockets asynchronous

在下面的代码中,我拨打了从Main()Receive()的来电,然后调用Async BeginReceive(),并完成在后台线程中接收数据。

问题:对于第一次读取,BeginReceive成功并附加StringBuilder。但是,再次调用时,永远不会达到if(bytesread>0)条件,因此我从不对收到的数据采取行动。 我希望BeginReceive处理多个读取,并且(我认为这与线程有关)我希望Main()函数始终从客户端侦听新的COMMANDS(不是新的连接,我' d喜欢保持相同的Socket)。这甚至可能吗?

Attempts At Solution:我添加了ManualResetEvent,试图阻止Main()函数在另一个线程中进行异步读取之前退出。

Main()中的相关代码:

        Receive(server); //await instructions from the client
        done.WaitOne(); //This is a ManualResetEvent.
        Console.ReadLine();

方法定义:

        public static void Receive(Socket server)
    {
        try
        {
            SocketArgs sockargs = new SocketArgs();
            sockargs.handler = server;


             server.BeginReceive(sockargs.buffer, 0, sockargs.buffersize, 0, new AsyncCallback(ReceiveCallBack), sockargs);

        }
        catch
        {

        }
    }
    public static void ReceiveCallBack(IAsyncResult ia)
    {
        try
        {
            SocketArgs sockargs = (SocketArgs)ia.AsyncState;
            Socket server = sockargs.handler;
            int BytesRead = server.EndReceive(ia);
            if (BytesRead > 0)
            {
                //Continue reading data.
                sockargs.sb.Append(Encoding.ASCII.GetString(sockargs.buffer, 0, BytesRead));
                MessageBox.Show(sockargs.sb.ToString());
                server.BeginReceive(sockargs.buffer, 0, sockargs.buffersize, 0, new AsyncCallback(ReceiveCallBack), sockargs);
            }
            else
            { //Do stuff with sb.ToString()



                done.Set();
            }
        }
        catch(Exception e)
        {
            MessageBox.Show(e.ToString());
        }
    }

2 个答案:

答案 0 :(得分:0)

当套接字断开连接时,BytesRead仅返回零。因此,我的问题的解决方案是简单地处理else {}部分中的断开连接。

可以在这个非常有用的article中绑定更多信息。

编辑:为了澄清,我在if()结构的末尾留下了BeginReceive()调用,因此“始终”发生了BeginReceive()操作。

答案 1 :(得分:0)

重置事件,以便WaitOne再次阻止。根据评论,事件被错误地置于设置状态,导致Main退出。