c++ socket通信 服务端设计思路,包括阻塞和非阻塞的。
重点需要:
1.多个客户端连接服务端,服务端采用一个客户开一个accept线程好,还是一个accept服务多个客户?
2.当客户端们连接上了服务端后,服务端如何能够知道那个客户端给他发了信息;在需要给指定的客户端发送信息的时候,如何做?

解决方案 »

  1.   

    1.accept跟通讯是可以分离的.你可以设计成有限线程按accept->Service->accept的迭代模式,也可以使用accept->CallNewThread(Service)->accept的一种模式,其中CallNewThread,即是把服务交给其它线程.
    2.服务端可以根据信息源socket(Accept之后会产生一个会话socket,而不是延用listen socket),然后在你的整个处理过程当中把它当成参数(或者某一参数的部分),于是在任何时间点都能够明确当前服务的是哪socket(连接会话).
      

  2.   


    1.accept()放在主线程,然后可以accpet后,每个客户开一个线程处理(最简单的模型了)
    2.accept()后的socket就是客户的标识,都是唯一的,这些socket句柄你自然要用链表或容器保存好,之后用时再搜索就知道哪个是哪个了.
      

  3.   

    accept的时候能够获得跟每个客户端连接的socket...
    通信的时候就靠这些socket就可以了..
      

  4.   

    accept因该放在主线程中,不过如果采用了事件选择模型或者消息选择模型的话,这些就不用你考虑了
    在服务器端调用accept以后,会返回一个socket,以后这个socket就是和你的某一个客户端(就是你发送connect请求的那个)对应连接起来的了,以后所有的io操作就在服务器和客户端的这两个socket之间进行了,这就是因为tcp是有连接的
      

  5.   

    >kevin0808:accept因该放在主线程中,不过如果采用了事件选择模型或者消息选择模型的话,这些就不用你考虑了 
    >在服务器端调用accept以后,会返回一个socket,以后这个socket就是和你的某一个客户端(就是你发送connect请求的那个)对应连接起来的了,以后所有的>io操作就在服务器和客户端的这两个socket之间进行了,这就是因为tcp是有连接的.我为accept返回的socket选择了事件(FD_READ | FD_WIRTE)然后将该socket放到vector里面了。
    问题:
    1.在放入容器的时候是不是需要做个CritialSection保护一下?(可能在收到FD_READ的事件的时候会读vector)。
    2.需要为每一个客户端开一个线程来通信吗?还是一个线程来服务?都有什么好处和坏处?谢谢各位的回答。
      

  6.   

    >accept()放在主线程,然后可以accpet后,每个客户开一个线程处理(最简单的模型了) WinEggDrop,还有哪些模型,请您不要吝惜,再给俺介绍一下好吗?
    我很想了解服务器线程控制方面。感谢!
      

  7.   

     重点需要: 
    1.多个客户端连接服务端,服务端采用一个客户开一个accept线程好,还是一个accept服务多个客户? 
    一对一吧
    2.当客户端们连接上了服务端后,服务端如何能够知道那个客户端给他发了信息;在需要给指定的客户端发送信息的时候,如何做?
      这个就是每一个socket来链接的时候都不一样的,都具有唯一性,你要负责保持好这些数据(用链表就可以)
      

  8.   

    现在最方便高效的就是用IOCP模型来做.简单高效.能应付大批量的客户端连接.网上例子多的是,随便找个改改就行了.
      

  9.   

    1.多个客户端连接服务端,服务端采用一个客户开一个accept线程好,还是一个accept服务多个客户?我个人感觉要看你用的是 什么类型的套接字 流类型的 还是每一个ACCEPT()一个进程,别的类型的就随意了 反正也不面向连接的2.当客户端们连接上了服务端后,服务端如何能够知道那个客户端给他发了信息;在需要给指定的客户端发送信息的时候,如何做?感觉你是个新手 哈 比我还新~~~~ACCEPT()函数返回了一个套接字 貌似这个套接字里面 有你想要的 客户端的相关信息.... 貌似是....
      

  10.   

    作为服务器的用户列表,操作的时候当然需要用临界区保护下的,因为可能这边你在遍历,那边又有人退出或者加入
    我觉得应该是为每个用户的通讯开一个线程的,如果你并发要求高的话,你必须使用线程池了,这样有点吃力不讨好。上面有人推荐了windows下的iocp完成端口,这也是我windows下最好的网络模型了
    在linux下的话,有一个叫epoll的模型,也用来应付高并发的