EPOLL 服务器通信设计问题请教

C++语言 码拜 10年前 (2015-05-11) 979次浏览 0个评论
 

搜到下面的帖子:
http://bbs.csdn.net/topics/370160039?page=1
看到版主qq120848369 贴了代码是C版本,能否工程发个包上来呀 呵呵

最近用ARM开发,以前都裸奔,现在上Linux系统,发现没那么自信,特别是在C板块里,有位大牛说“你们后面等死吧”,心有余悸…
考虑到通信的稳定性对产品的影响,还是再聆听一下大神的教诲

先说一下现在的情况
1 采用EPOLL模式,同时支持UDP和TCP,也就是服务器程序,同时可以处理多客户端(无论是TCP 或UDP协议)的请求交互。
  
       按同事要求,ARM上处理结果,通过TCP/UDP的向PC端(客户端)的发送函数,必须在任意文件中可以随时调用(工程包括N个.c文件,在需要的时候,在某个.c文件就可以调用把处理结果返回给PC端,),原来想无论TCP/UDP来的命令请求,调用一个函数 do(in ,out),通信到此为止,后续和硬件关联的操作结果,通过OUT参数带出来,再发给PC端,但是同事不知出于什么考虑,不予采纳…

 现在问题是
 TCP 和UDP,单独工作都没问题,但是想同时工作就打架,具体就是,无论客户端哪种协议(UDP也好,TCP也罢,甚至485,232),命令到服务器端后,都调用DO(IN) 函数,在DO函数中解析命令,根据不同命令调用不同函数(函数嵌套可能比较深,也就说一个命令下来,在DO中解析后,根据命令不同,可能调用某个.c文件中的A函数,而A函数可能调用另个.c文件中的B函数),比如到了B函数时,要向PC发数据了,分不清是该用TCP 还是UDP发送…
上面就是目前的主要问题

 还有一个问题
 就是服务器端不能执行最新的客户端请求指令
    目前用测试工具,定时发送指令给服务器,发现服务器不能理解执行最新命令,应该是服务器端为处理完,导致缓冲区存的前面命令继续被执行…
    比如:客户端定时发送指令周期 10ms,,而服务器端从接到命令开始,到执行结束需要20ms,,因此1S 客户端发送给服务器的指令包数是:100个,而服务器端只能执行50个,此时来最新的指令(也就停止定时发送的命令,换一个新命令来)不能理解执行,而是把缓冲里的前面50个执行完了,才能执行最新的指令,如何让服务器端在新命令来时,抛弃缓冲里的50个老的命令包…

有兴趣的就指导一下

100分
不是给你举过例子吗?
多线程(各调用方)直接调用socket的send发送数据,各线程的数据会随机混和导致接收方无法分辨是那个线程发送的数据。
所以你必须
让多线程(各调用方)加临界区锁调用你提供的将待发送数据填写到FIFO队列队尾,而另开一个单独线程从FIFO队头取数据调用socket的send发送数据。

虽然本ID没弄过epoll。

上帖以TCP为例。UDP本ID没搞过。
换了块板子就OK了

内核版本导致问题》。。。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明EPOLL 服务器通信设计问题请教
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!