实现内容:在一个服务器启动监听 N个客户端会自动连接该服务器只是连接并不发送消息 服务器需要做的是客户端连 接后给客户端发送消息
        private void Listen()
        {
            IPAddress ipAddress = IPAddress.Parse("192.168.1.2");
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 5500);            //Create a TCP/IP socket
            Socket listener = new Socket(AddressFamily.InterNetwork,
                SocketType.Stream, ProtocolType.Tcp);            try
            {
                listener.Bind(localEndPoint);
                listener.Listen(100);                while (true)
                {
                    //Set the event to nonsingaled state
                    allDone.Reset();                    //Start Waiting
                    listener.BeginAccept(
                        new AsyncCallback(AcceptConn1),
                        listener);                    //WaitUntil
                    allDone.WaitOne();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            } 
        }        public void AcceptConn1(IAsyncResult iar)
        {
            //Signal the main thread to conntinue
            allDone.Set();            Socket s = (Socket)iar.AsyncState;
            try
            {
                Socket handler = s.EndAccept(iar);
                StateObject state = new StateObject();
                state.worksocket = handler;
                handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallBack), state);
                            }
            catch (Exception ex)
            {
             }
        }上面是代码 客户端连接同时发送给客户端消息应该写在哪里 求指教

解决方案 »

  1.   

    发送什么??另外,写BeginAccept是十足的画蛇添足的,你的这个代码是假的唬人的异步代码。写同步Accept还能轻快一点。
      

  2.   

    你把Accept到的Socket保存到一个集合里面,需要发消息的时候foreach一次不行吗?
      

  3.   


    //当此方法执行的时候,说有个客户连接进来了,你可以用Socket s回复它。
    public void AcceptConn1(IAsyncResult iar)
      {
      //Signal the main thread to conntinue
      allDone.Set();  Socket s = (Socket)iar.AsyncState;
      try
      {
      Socket handler = s.EndAccept(iar);
      StateObject state = new StateObject();
      state.worksocket = handler;
      handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallBack), state);
      }
      catch (Exception ex)
      {
      }
      }另外:你这代码哪里抄的BeginAccept()根本需要和while组合使用的while (true)
      {
       //Start Waiting
      listener.BeginAccept(
      new AsyncCallback(AcceptConn1),
      listener);
    }
      

  4.   

    另外:你这代码哪里抄的BeginAccept()根本不需要和while组合使用的
      

  5.   


    那么在你的 Socket handler = s.EndAccept(iar) 代码之后,直接向handler执行send操作就行了。
      

  6.   

    另外你的代码,异步进行Accept是画蛇添字的。就算是同步阻塞Accept,反正你是异步Receive,所以同步和异步Accept是一样的,都是(按照你的写法)阻塞那么长时间。真正的异步Accept,不需要放在一个while循环中,也不需要用信号量阻塞。主程序只要写BeginAccept这就结束了,没有更多的代码需要执行了。然后在异步Accept的回调中你才需要另外再执行一个BeginAccept。另外有人说在异步Accept的回调中去执行BeginAccept是回调。这是不对的。简单套用语法看似回调,但是这是异步操作,根本不是回调,也没有那种回调的占用堆栈的问题。
      

  7.   

    sorry,上面打字太随意了,呵呵写错了一个词,特此更正:另外有人说在异步Accept的回调中去执行BeginAccept是递归调用。这是不对的。简单套用语法看似递归调用,但是这是异步操作,根本不是递归调用,也没有那种递归调用的占用堆栈的问题。
      

  8.   

    做异步通信可以建立一个接收队列,并对队列设置一个HasRecvObj的事件,有信息时,BeginAccept会使用新的线程激发AcceptConn1(IAsyncResult iar)的callback, 在AcceptConn1(IAsyncResult iar)
    中,可以将收到的数据入队,并使用HasRecvObj.BeginInvoke()方法发出异步通知,通知数据处理程序(注册该事件的程序)进行处理。
      

  9.   

    对不起,是 ReadCallBack中取收到的数据
      

  10.   

    aceept到一个连接后,生成一个客户端socket,向这个socket发数据就可以了