这个是我根据别人的代码得到的http://www.cnblogs.com/jeriffe/articles/1407603.html    foreach (DictionaryEntry de in hashTable)
               {
                   client.Send(e.Buffer, e.BytesTransferred, SocketFlags.None); //发送数据
                     ////**** ///这里该怎么写 能给所有连接发信息 
                   /////*******
               }
  这里该怎么写 把得到的连接 群发信息,这个地方该怎么写,谢谢各位了,这个部分没有接触过,请高人指点
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Collections;
namespace ConsoleApplication1
{
       class Program
       {//http://www.cnblogs.com/jeriffe/articles/1407603.html
        
        static void Main(string[] args)
        {
            EchoServer server = new EchoServer(new IPEndPoint(IPAddress.Any, 8888));
            //EchoServer server = new EchoServer(new IPEndPoint(IPAddress.Any, 8888));
            Console.ReadKey();        }
        
    }
       public class EchoServer
       {
           Socket server;
           public Hashtable hashTable;
           public EchoServer(IPEndPoint localPoint)
           {
               server = new Socket(localPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);               server.Bind(localPoint);
               server.Listen(5);
               Console.WriteLine("Server is bind on {0}", server.LocalEndPoint);
               accept_async();
           }           private void accept_async()
           {
               var accept = new SocketAsyncEventArgs();
               accept.Completed += accept_Completed;
               server.AcceptAsync(accept);
           }           void accept_Completed(object sender, SocketAsyncEventArgs e)
           {
               accept_async();               var client = e.AcceptSocket;
               Console.WriteLine("Socket:{0} connection:{1}", e.AcceptSocket.RemoteEndPoint, "服务器");
               Hashtable hashTable = new Hashtable();
               hashTable.Add("1" + e.AcceptSocket.RemoteEndPoint, e.AcceptSocket);
               e.Completed -= accept_Completed;
               e.Completed += receive_Completed;               var buffer = new byte[1024];
               e.SetBuffer(buffer, 0, buffer.Length);               client.ReceiveAsync(e);               foreach (DictionaryEntry de in hashTable)
               {
                  
                   Console.WriteLine(de.Key);//de.Key对应于key/value键值对key
                   Console.WriteLine(de.Value);//de.Key对应于key/value键值对value
               }
               //Client.
               Console.WriteLine("*********" + e.AcceptSocket.RemoteEndPoint);
           }           void receive_Completed(object sender, SocketAsyncEventArgs e)
           {
               var client = sender as Socket;
               if (e.BytesTransferred == 0)
               {
                   Console.WriteLine("socket is closed");
                   client.Close();
               }
               else
               {
                   client.ReceiveAsync(e);//接到数据
                   string message = Encoding.GetEncoding("gb2312").GetString(e.Buffer, 0, e.BytesTransferred);//获取接收到的数据
                   //  string message = Encoding.Unicode.GetString(e.Buffer, 0, e.BytesTransferred);//获取接收到的数据
                   Console.WriteLine("Socket:{0} send message:{1}", client.Handle, message);
                   // string sent=string.Format("{0} bytes has been received",e.BytesTransferred);                   string sent = string.Format("{0} bytes has been received", message);
                   client.Send(e.Buffer, e.BytesTransferred, SocketFlags.None); //发送数据                  
                   Console.WriteLine("Sent {0} bytes data to socket:{1}", e.BytesTransferred, client.Handle);
               }               foreach (DictionaryEntry de in hashTable)
               {
                   client.Send(e.Buffer, e.BytesTransferred, SocketFlags.None); //发送数据
                     ////**** ///这里该怎么写 能给所有连接发信息 
                   /////*******
               }
           }
       } 
}

解决方案 »

  1.   

     client.Send(e.Buffer, e.BytesTransferred, SocketFlags.None); //
    这个不都发过了嘛这个只是发送给该连接的客户端若是你想发送给所有客户端消息,那么你需要在服务器做一个列表,用来存放这些连接这样你就对任意个客户端发送消息了。
      

  2.   

    vto  wodegege10    你帮我看下 我把连接存到hashTable 这样存对不
    foreach (DictionaryEntry de in hashTable) 
                  { 
                      client.Send(e.Buffer, e.BytesTransferred, SocketFlags.None); //发送数据 
                        ////**** ///这里该怎么写 能给所有连接发信息 
                      /////******* 
                  } 上面只能给当前连接发 ,  该怎么写给所有连接发
    client.Send(e.Buffer, e.BytesTransferred, SocketFlags.None); //发送数据  这里不知道怎么写
      

  3.   

    void accept_Completed(object sender, SocketAsyncEventArgs e) 
    在这个事件处理函数写发送,是当收到客户端来的消息后,被动发送的不知你什么时候需要发送消息到所有客户端。
    若是需要主动发送,
    那么再写一个发送方法。(简单的示例)
    bool SendAll(byte[] msg){
        foreach (DictionaryEntry de in hashTable) 
                  { 
                      client.Send(msg, msg.Length, SocketFlags.None); //发送数据 
                        } }
      

  4.   

    当然Hashtable hashTable = new Hashtable(); 这个要弄成成员变量。
    不然找不到的哦。
      

  5.   

    to  wodegege10bool SendAll(byte[] msg){ 
        foreach (DictionaryEntry de in hashTable) 
                  { 
                      client.Send(msg, msg.Length, SocketFlags.None); //发送数据 
                        } }msg 传字符吗” 如消息这样的吗。   哪个套接字 ,我那样保存没有问题吧  ,一会测试下 
      

  6.   

    msg是字节数组,不能直接传字符串的。你可以声明一个全局变量如:
    List<SocketAsyncEventArgs> asyncArgs = new List<SocketAsyncEventArgs>()
    然后当连接进来时,修改accept_async() 函数如下:
    private void accept_async() 

        var accept = new SocketAsyncEventArgs(); 
        asyncArgs.Add(accept);//记录新建的连接。
        accept.Completed += accept_Completed; 
        server.AcceptAsync(accept); 

    最后在SocketAsyncEventArgs中断时,从asyncArgs列表中将其移出。不过现在有个问题,就单从你参照的那个例子来说,是不完善的,因为只有receive_Completed而没有send_Completed,显然你这里要发送数据,没有设置send_Completed将不知道是否发送成功。连接中断可以从是否发送成功来判别,但是这里没有给那个余地,是不对的。此外这代码还有一个最大的问题,使用SocketAsyncEventArgs并不保证当前操作是同步或者是异步的,这个看实际情况,所以代码中需要分别对待,对两种情况分别处理,这在MSDN上有详细例子可参照的。
      

  7.   

    回过来再看了下那个代码,无语!
    居然把同步和异步方法混用,接收用ReceiveAsync,发送却用Send,这显然是半吊子做法,既然要用新的SocketAsyncEventArgs,那发送就应该使用SendAsync来发送才对。
      

  8.   

    to  qldsrx 谢谢你的指导  ,我对这个地方的确不了解,从别人那里抄来的,并切还没有抄明白,  有这样的事例吗 能发个完整的不,或者这个方面的详细资料也可以.因为我在网上搜索很多天了,有点迷糊,能提供下最好了 ,我信箱是[email protected]
      

  9.   

    SocketAsyncEventArgs,因为那个使用难度较高。MSDN上有现成的例子可参照    他的例子 很多东西都没有介绍
      

  10.   

    网上要是有,估计你应该也能找到,找不到说明没有,毕竟现在职业程序员用的.NET版本一般都比较老,一方面为了让WIN2000可以使用,另一方面是框架的版本较低,重新开发框架不划算。我也只不过看过微软提供的例子,最多说说那个例子上你看不懂的地方,详细资料就没有了。你可以截取MSDN上示例代码看不懂的地方来问啊。