利用MultiThread
还要注意数据结构处理得如何

解决方案 »

  1.   

    应该纯粹用sdk,也就是说用socket的方式进行开发,然后配合多线程,不知道效率会怎么样??
    另外请大家讨论一下数据库的问题,毕竟很多资料要保存在那上面
      

  2.   

    一般服务器程序是用 线程池机制 实现高并发的
    只对多CPU服务器有效:)
      

  3.   

    不是告诉你了嘛,用线程池处理
    对于每个用户的请求分配到不同的线程上处理。
    对于多路CPU的服务器,性能提高很大!
      

  4.   

    http://www.codeproject.com/threads/threads/threads_demo.zip
      

  5.   

    http://www.codeproject.com/threads/threads/threads_src.zip
      

  6.   

    好了,下面是我的一些想法,希望大家批评指正数据接收的时候采用完成端口,一旦接收到数据,将数据保存到一个数组(可能采用stl地vector实现)当中
    然后继续投递一个新的wsarecv
    另外有一个县城专门负责发送数据,考虑到数据同步的问题,打算采用这种方式
    socket受到数据放入数组一,同时设置一个信号灯,当发送县城得到该信号灯后锁定该数组(防治有新的数据打乱),拷贝,并清空该数组,解锁,发送拷贝不知道大家对这个模型有何看法,请指教
      

  7.   

    其实 完成端口 在WIN32平台下是目前性能最好的服务器设计方法,它采用的
    就是线程池的方法,不过只能在Win NT 系列上运行。要开发这样的服务器,当然要采用线程池的方式,如果不采用完成端口的方式可以用1个或多个线程监听,然后将连接的客户socket放进一个列表里面,然后 用 n 个工作线程来处理这个列表里面的socket,具体实现的时候一定要注意线程同步与数据访问
    的并发控制。
      

  8.   

    ShallonXu()老兄,能不能具体针对这个问题发表点看法呢,
    目前,可以确定的是准备采用完成端口的方式来进行处理
      

  9.   

    请参考以下文章, 本文作者提出了10个方面的设计可以在不同程度上
    影响Server性能. 其中一个设计是关于在server中使用线程的(见下原文),
    可能或许对你有所帮助.
    另外, 除了考虑在server中使用多线程外,作者在其他9个方面的讨论也是
    设计一个高性能server时应该引起重视的.-----------------------------------------------
    Tuning the number of threads active in a server is critical. If the threads are I/O-bound, they'll spend much of their time
    blocking, waiting for I/O to complete — and a blocked thread is 
    a thread that's not doing useful work. Adding additional threads
    can increase throughput, but adding too many threads will decrease 
    server performance, because context swapping will become a 
    significant overhead. The rate of context switches should be kept 
    low for three reasons: context switches are pure overhead and 
    contribute nothing useful to the application's work; context 
    switches use up valuable cycles; and worst of all, context switches 
    leave the processor's caches full of stale data, which is expensive 
    to replace.Much depends upon your threading architecture. One thread per client is almost never appropriate, as it does not scale well to large numbers of clients. Context switching becomes intolerable and Windows NT runs out of resources. A thread pool model, where a pool of worker threads consumes a queue of requests, works better. In the future, you will no longer need to write your own thread pool, because Windows 2000 provides suitable APIs, such as QueueUserWorkItem. 
      

  10.   

    做一个链表
    每建立一个连接就加入到链表里
    每断开一个连接就从链表里删除
    要开发高性能的服务器应用
    完成端口是不二的选择~~~~
    偶正在用完成端口做一个WEBSERVER
      

  11.   

    snsins(无地自容) 嗬嗬,既然都在用这个,那咱们可以要好好参和一下,我的qq是185938
      

  12.   

    首先你最好直接用Win32 API的方式,不要用CSocket如果用完成端口的话,你可以这样做1. 建立完成端口 2。可以开一个或者多个socket进行监听,
    3。开 n  个工作线程,进行对客户的处理
    3, 将accept的客户套接字和完成端口联系起来
    4。工作线程处理客户的请求基本模式就是这样Apache Web Server 在NT下面就是这样的模式,你可以参考一下
    它在 Win 9X 下面就是采用的我在上面说的那种模式,具体你可以看
    它的源程序
      

  13.   

    对,用多线程吧,记得在WINDOWS网络编程这本书中就有详细说明和一个例子,去看看吧!
      

  14.   

    你说的方法我知道,我也考虑过,就是
    一个线程或者多个线程 Accept用一个或多个线程接收客户发来的数据,然后将接收到的数据放入一个
    任务队列(这个任务队列就是专门进行存放待处理数据的队列,每一项任务包括一个完整的数据包和客户的socket端口)用一个或者多个线程从任务队列取任务(数据和客户的socket 端口),然后
    对数据进行处理,处理完以后就根据客户的端口发送回给客户。
    其实我觉得这种模式和完成端口的模式有点类似,不过我没有试验过,不知道
    这样的性能怎么样,但是这种方法肯定可行。
      

  15.   

    基本模型是这样的
    当然采用完成端口了,开cpu*2各工作线程在完成端口上等着
    当接收到数据,加锁,将此数据拷贝到vector<char*>的一个全局变量中,解锁,然后继续投提一个wsarecv()请求,同时让event有信号
    另有一个工作线程等待event有信号,加锁,将此数据拷贝到局部的vector<char*>变量中,解锁,对此数据进行处理,然后发送,让event无信号基本上就是这样了,最后请大家确认一下,有何不足,
      

  16.   

    这种模型是可以的,不过你的数据缓冲区最好是要写一个类来管理
    比如 CDataBuffer
    这样的你的任务(数据)队列即为 queue<CDataBuffer> 这样比较好
    另外对于数据访问的并发访问的时候,你最好也写一个类来实现,因为你这个
    属于生产者/消费者问题,这个类比如为CWriteReaderSyncObj等你这些类都构造好了,你的整个程序实现起来就
    比较清晰一些,也更加利于维护。写这样的系统一定要注意整个程序的架构!
      

  17.   

    http://www.codeproject.com/internet/winsockiocp.asp这个例子比较好,你可以看看
      

  18.   

    他也是用的两个东西分别保存overlapped和socket的阿
      

  19.   

    你就分开用吧
    Apache是在一个结构里面的
    当然了,那样方便就那样用,是不是
      

  20.   

    多谢,我暂时还是分开来用吧,我也想连在一起,不过方法不太清楚你的web server怎么样了,apache2出来了,我去找来看看完成端口的问题说多不多,说少也不少啊!!
      

  21.   

    我做的不是WEB Server,是另外的服务器,主要是用于计算,因为很多计算
    在单机上耗时较长,所以专门做一个计算服务器,不过用的不是socket,
    是我自己写的一个通信库,模拟socket的方式,主要用在局域网上面,不过以前倒是经常用socket,
      

  22.   

    自己写的一个通信库??不用socket,那用不用tcp/ip呢??怎么和驱程打交道呢???嗬嗬,厉害