如题
服务器接收客户端过来的命令,然后开始发送数据
要保证客户端不断开的话就一直发送
现在一个客户端没问题,增加一个客户端就会出现发送错误的现象了
主要数据中有报文格式的一个要求,收到客户端一个命令,接收序号+1
发送出去一个命令,发送序号+1
双方根据序号来判断接收报文是否丢失我现在是一个异步的过程
如何实现不同客户端连接过来后发送的序号不会错误
就像一个客户端一个线程一样,对其中的发送的数据互不影响
public void StartThread()
        {
            ..........
            listenersocket.BeginAccept(new AsyncCallback(AcceptCallback), listenersocket);
            ............        }        private void AcceptCallback(IAsyncResult ar)
        {
            .......
            listenersocket.BeginAccept(new AsyncCallback(AcceptCallback), listenersocket);
            .......
            handler.BeginReceive (state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback (ReadCallback), state);
             ......
        }        private void ReadCallback(IAsyncResult ar)
        {
           ......//这里组织要发送的数据和发送的序列号
           //如果增加多个客户端,如何实现数据按照不同客户端发送不同的内容
           //
            handler.BeginSend (state.buffer, 0, state.buffer, 0, new AsyncCallback (SendCallback), handler);
          .......        }路过的来指点下,异步搜遍网络,没发现真正实质的例程,基本是抄MSDN异步那个例子,真的很是郁闷啊

解决方案 »

  1.   

    给每个客户创建一个数据结构,用来保存状态。
    当异步操作的时候,根据状态来进行操作。
    比如:public class StateObject
    {
       public Socket socket = null;     // 客户所对应的Socket
       public const int BUFFER_SIZE = 64*1024;
       public byte[] buffer = new byte[BUFFER_SIZE];
       public int offset = 0;   public int runningNumber;        //序列号
    }异步以及StateObject的使用,可以借鉴下贴4楼的例子:
    http://topic.csdn.net/u/20120312/20/434850ff-8eed-4851-afdb-c07cc8a82773.html
      

  2.   

    或者服务端持有一个Mapping来映射客户端状态。
    如果多客户端共享同一份数据,又要发不同的数据块。好像这是冲突的。
      

  3.   

    你的理解出问题了,readcallback回调函数对应的已经是某个特定的客户端了,你所需要做得仅仅是获取发送指令再判断指令序号处理即可。
    C#的异步socket已经是最简单的了。流程主要就2步。
    1.创建listen端口并开始listen。
    2.beginaccept,同时定义accept回调函数,其中上下文包含listen的socket
    3.用上下文中listen的socket获取初始连接客户端发送的报文并启动beginrecieve开始正常连接,同时定义receive回调函数,其中上下文包含已与某客户端连接的socket
    4.receive回调函数中获取报文信息,直接调用上下文中得socket操作发送即可。
      

  4.   

    管理序号只要加个锁就成了,例如private ulong num=0;
    private object lock= new object();public void yourMethod(....)
    {
        Msg s;
        ....
        lock(lock)
        {
            if(num== ulong.MaxValue)
                num=0;
            else;
            num++;
            s= 使用num参数产生你要发送的消息(num,.....);
        }
        Send(s);
    }修改和读取使用num的时候只要lock就行了。lock是一个编程者不能不知道的基本概念。
      

  5.   

    任何一个讲求一点效率的程序,不管是需要流畅地处理用户交互和动画显示的客户端,还是一个稍高负载的服务器端,都需要大量多线程操作。偶尔地,需要lock一些数据以保证一致性。lock操作当然是是越少越好,但是肯定需要,所以不能不知。
      

  6.   


    这里我看不出你想表达什么。任何程序都有一个逻辑设计,要看这个做逻辑设计的人脑筋是否清醒。如果你自己对业务需求毫无概念,只想要抄袭csdn上一个空洞的代码,那是毫无必要。你把这里空着,或者干脆删除就好了。你说不出逻辑需求,就不必要求别人给你抄一段垃圾代码出来。