服务器采取异步监听方式,如果有新连的,产生新连接
问题出来了,如果手动关闭,会产生错误:
Cannot access a disposed object.
Object name: 'System.Net.Sockets.Socket'.我的想法是怀疑是由于没有关闭监听。可是发现自己不会关…………请教各位,急用,谢谢!!有关代码如下例private void Form1_Load(object sender, EventArgs e)
{
    SocketListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, 8080);
    SocketListener.Bind(ipLocal);
    SocketListener.Listen(100);
    SocketListener.BeginAccept(new AsyncCallback(OnClientConnect), SocketListener);
}private void OnClientConnect(IAsyncResult asyn)
{
    Socket SocketListener = (Socket)asyn.AsyncState;
    NewConnection(SocketListener.EndAccept(asyn));
    SocketListener.BeginAccept(new AsyncCallback(OnClientConnect), SocketListener);
}private void button1_Click(object sender, EventArgs e)
{
    if (SocketListener != null)
    {
        SocketListener.Close();
    }
}请教各位高手,如果我想的没有使用EndAccept关闭,而导致的错误,那么如何使用,才不出现错误信息如果不是因为EndAccept的问题,那为什么会报错呢?谢谢谢谢!!!

解决方案 »

  1.   

    private void AsyncAccept(IAsyncResult ar)
    {
    //异步回调接受连接请求
    try
    {
    allDone.Set();
    Socket a_socket = (Socket)ar.AsyncState;
    Socket handle = a_socket.EndAccept(ar);
    socketaccepted(handle);
    //进行异步接收数据
    handle.BeginReceive(received, 0, received.Length, SocketFlags.None, new AsyncCallback(AsyncReceive), handle); 
    }
    catch(Exception ex)
    {
    Console.WriteLine(ex.ToString());
    }
    }
      

  2.   

    首先谢谢楼上的前辈关注。也许我没完全说清楚,我再补充下,我的问题关注在:如果按了button1,手动关闭处于监听状态的socket,会导致捕获异常
    “Cannot access a disposed object.Object name: 'System.Net.Sockets.Socket'.”所以我想在private void button1_Click(object sender, EventArgs e)方法里,怎么弄加代码,把socket关闭监听状态,然后再close不知道哪位高人能指教1234啊~~谢谢谢谢!!!分如果不够,我可以再加!真的感谢每一位的帮助!!
      

  3.   

    SocketListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);private void button1_Click(object sender, EventArgs e)
    {
        if (SocketListener != null)
        {
            SocketListener.Close();
        }
    }
    楼主注意下SocketListener负责监听,但不产生连接,真正的连接是后面的
    NewConnection(SocketListener.EndAccept(asyn));
    ==========================================
    同时SocketListener != null不为空并不表示SocketListener 已经建立了一个连接
    SocketListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);这句就已经使SocketListener 不为空了。
      

  4.   

    public static void AcceptCallback(IAsyncResult ar) {
            // Signal the main thread to continue.
            allDone.Set();        // Get the socket that handles the client request.
            Socket listener = (Socket) ar.AsyncState;
            Socket handler = listener.EndAccept(ar);        // Create the state object.
            StateObject state = new StateObject();
            state.workSocket = handler;
            handler.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0,
                new AsyncCallback(ReadCallback), state);
        }关闭的时候
    handler.Shutdown(SocketShutdown.Both);
    handler.Close();明白了吗?关闭的不是那个listener
      

  5.   

    恩,我明白楼上的意思。我的程序在关闭时候,已经关闭了所有的连接可是那个SocketListener是一直处于监听状态的啊。。
    SocketListener.Close()会导致Cannot access a disposed object我想关闭SocketListener的监听状态,不知道如何处理呢
      

  6.   

    每遇到连接请求,都会新建一个socket,Socket handler = listener.EndAccept(ar);
    而Socket listener = (Socket) ar.AsyncState
    是地址传递,仍然是原来的listener ,还处于监听状态
    到这我说的对吗?如果开始后,并没有任何连接请求,及不会产生任何handler ,那就用不到Shutdown
    而只要关闭监听了……