本人编写中央监护系统,多个客户端同时不间断向服务器传递数据,要求服务器将收到的数据全部存下来,同时要将数据绘出来(数据包是一些图形数据,显示时只需从中挑出几个显示)。客户端是向服务器的不同端口发送数据。请问各位有什么好的解决方案?如能解决,定当高分相送!!!!

解决方案 »

  1.   

    这只是一个很普通的问题。
    创建一个SOCKET监听线程,不会有非议吧。
    当有连接请求时,建立连接并创建处理线程。
    创建多少个处理线程才是最合适的呢?简单分析一下:
    创建处理线程的目的只有一个,那就是提高响应连接请求的速度。
    为什么这样就能提高响应速度呢?
    因为监听线程在通讯线程结束之前,就可以响应下一个请求。
    处理过程越长,这种优势就越明显。
    创建多个处理线程对系统的处理速度有什么影响呢?
    显而易见,线程越多,线程调度占用的CUP时间就越多。
    可见,创建多处理线程只会消耗系统处理能力,而不会提高系统处理能力。
    当然,我们要做的软件,在理论上是系统能够承受的,如果确实面临对CUP的威协,那就要限制通讯线程的数量,并及时报警。
      

  2.   

    这只是一个很普通的问题。
    创建一个SOCKET监听线程,不会有非议吧。
    当有连接请求时,建立连接并创建处理线程。
    创建多少个处理线程才是最合适的呢?简单分析一下:
    创建处理线程的目的只有一个,那就是提高响应连接请求的速度。
    为什么这样就能提高响应速度呢?
    因为监听线程在通讯线程结束之前,就可以响应下一个请求。
    处理过程越长,这种优势就越明显。
    创建多个处理线程对系统的处理速度有什么影响呢?
    显而易见,线程越多,线程调度占用的CUP时间就越多。
    可见,创建多处理线程只会消耗系统处理能力,而不会提高系统处理能力。
    当然,我们要做的软件,在理论上是系统能够承受的,如果确实面临对CUP的威协,那就要限制通讯线程的数量,并及时报警。
      

  3.   

    to szqm123:
    可否给个例子程序,谢谢!
      

  4.   

    同意 Frank123(Frank) 所说 
    可以写一个消息排队器 专门负责客户端来的消息,使其能够平均分配
      

  5.   

    我想用两个进程,一个负责接收信息,另一个是处理信息用的,接收信息的直接select+noblock
    这样反正接收几百个套接字发送过来的信息是没有什么问题的,再做一个队列,每接收到就将接收到的信息插入到队列中,
    另一个处理进程从队列中取出信息,你机器有两个CPU的话,这两个可以同时进行的,不过要注意一下有个队列这个临界对象,用CS加以保护,应该不会有太大问题吧。用线程池的做法就是可以直接用堵塞型的,
    对每个接收消息的套接字生成一个进程,然后直接最原始的接收就可以了,不过最后也要加到那个消息队列中去(肯定是加指针啦)
    struct message
    {
      ip,port,MESSAGEHEADER* mheader;
    };
    list<message> mydeque这样也可以,最好不要用vector为基础的队列,那个比较差劲,我想。
    假如用完成端口的话,我想应该就是将接收信息的那部分放到完成端口中去实现,用wsarecv(sock,buf,.....)这样的东东。
      

  6.   

    大家统统不要误人子弟了,windows nt下效率最高的是采用完成端口模型,
    利用内核异步IO处理,完成端口的工作者线程数量为cpu数量的2倍。
    本人有现成的自己开发的程序(经过海量数据测试过的),
    如有需要请联系
    东软股份大连分公司电力部:唐立刚
                              [email protected]
      

  7.   

    大家统统不要误人子弟了,windows nt下效率最高的是采用完成端口模型,
    利用内核异步IO处理,完成端口的工作者线程数量为cpu数量的2倍。
    本人有现成的自己开发的程序(经过海量数据测试过,八个客户端每秒发送一千个
    4k左右数据,经过一昼夜运行交换数据达到每客户端千万数量级),
    如有需要请联系
    东软股份大连分公司电力部:唐立刚
                              [email protected]