当前位置:  技术问答>linux和unix

socket编程模型,命令流处理问题

    来源: 互联网  发布时间:2017-03-06

    本文导语:      我们通常用Poll和线程池来处理具有大量客户端的服务请求,比如一个客户发送一个命令给服务端,服务端根据命令字执行相应的动作,执行完后返回给客户端。 问题一:处理模式的问题     对于命令字不多...

    我们通常用Poll和线程池来处理具有大量客户端的服务请求,比如一个客户发送一个命令给服务端,服务端根据命令字执行相应的动作,执行完后返回给客户端。
问题一:处理模式的问题
    对于命令字不多的情况,服务端一般采用switch/case来处理每个动作。但是,如果有很多很多的命令字(几十或者上百个)通常如何处理?有没有什么比较通用或者权威的解决办法?
问题二:命令流问题
    就是服务器-客户端交互完成一系列动作,只有上一个动作成功执行,那么才继续往下走。如果是面向过程的编程,那么处理起来会方便一些,可以通过发送/返回,一步步得到确认后继续往下执行。但是如果用Poll、select等通过线程池实现,那么每次交互都会通过poll或者select函数分配线程,一系列动作如何协同?如何确认上一次成功才继续下一个动作?

    请各位不吝赐教!




|
对于问题2,我们的做法是:为每个新连接分配一个struct,作为记录这个连接的执行状态的状态机,放到以其fd为key的hash表里面;每次有新数据到来时候,根据fd取出对应状态机,并且跳转至相应的处理函数。
我们基本没有用到多线程。

|
如果一个线程能够自始至终的处理一个完整交互,倒是简单一些

如果由多个线程来处理每个事件,那是相当麻烦啊
比如说客户端发送10个字节,这10个字节可能不是一次到达服务端,也许先是2字节,再3字节,再5字节

那这样就先后有3个线程为这10个字节服务,还需要组装成一个完整报文,然后调用交易处理函数..

|
第二个问题里面:
客户端和服务端的处理思维是不同的,服务端需要对每个客户端保存现场,然后不管是开线程并行也好,还是分时轮询处理也好,都是按照状态来决定下一步处理的
客户端则不同,上一个状态未完成之前,要吗等,要吗超时,需要保持原子操作

第一个问题:
使用数组或者hash表都一样的,关键是把这个命令字执行的命令初始化链接到结构体中,这样一旦查找到命令字就可以直接执行了,免了再去找命令的时间

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • andriod下java socket网络编程:java socket客户端服务端代码示例
  • 大家帮忙推荐一本linux socket编程的入门书,我刚接触socket,谢谢!!
  • IOS开发之socket网络编程(基于SimpleNetworkStreams的c/s程序)
  • re socket编程中 ACCEPT返回的socket与原socket(他参数中的)端口号一样吗?
  • Linux c socket编程:简单的客户端(client)和服务端(server)实现
  • socket 编程时,write的写入的数据大于socket缓冲区,会有什么结果??
  • Linux下使用openssl api编程socket编程,为什么要编译啊?
  • 关于文件操作和Socket网络编程!
  • linux下socket编程问题!
  • socket编程 中的bind问题
  • socket编程--htons
  • 急!!请教关于linux socket编程的一个问题!!
  • 急!关于SOCKET编程,在线等待!
  • socket编程 通过man socket, 没有找到socket函数的第一参数该填什么 怎样利用man手册
  • 多进程socket编程问题
  • 问一个socket编程问题,急~~~
  • 求教!为何在socket编程中调recv函数无法阻塞?
  • 请教一个socket编程问题
  • 求助!!linux下socket编程
  • socket编程,使用recvfrom()函数监听问题。
  • sco unix下socket编程的问题,请大家帮忙
  • java命名空间java.net类socket的类成员方法: socket定义及介绍
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket
  • java命名空间java.nio.channels类socketchannel的类成员方法: socket定义及介绍
  • socket 通讯开发包 Simple Sockets
  • java命名空间java.nio.channels类serversocketchannel的类成员方法: socket定义及介绍
  • C++ Socket 库 C++ Sockets
  • java命名空间java.nio.channels类datagramchannel的类成员方法: socket定义及介绍
  • vc做的的socket应用和unix下socket?
  • java命名空间java.net类socket的类成员方法: getsendbuffersize定义及介绍
  • QSocketDevice ( int socket, Type type )中那个 int socket 是哪里来得?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3