毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> linux >> 正文

TCP接受数据长度大于接受设置的最大长度时怎么办? 第2页

更新时间:2012-10-18:  来源:毕业论文
 
TCP协议肯定是可靠的,不可能出现你说的溢出的情况。
只能是客户端的问题了,,客户端循环发的时候,得检测send的返回值,若-1且errno==EAGAIN,则就是发送缓冲满了。这时候可以使用select等,等待其可写,然后再重发送。(不知道你有没有客户端的源码,可以看看是不是没检测send返回值,有没有做相应的重发处理。)
测试的话,让客户端发送持续的大数据量。再将服务器端的接收缓冲设成1000,然后服务器不读取,然后看看服务器不读取的情况下,wireshark看这条tcp连接还有没有数据发送。。肯定是会停止的,所以只会出现在客户端了

问题应该在接收端。用epoll要注意ET和LT。
有这种可能就是:你用的epoll是工作有ET模式下,而你又的传进去的buffer不够大的时候,一次读不完,即状态不改变,然后下次用epoll_wait时就一直等不到通知了。

估计问题就是这个了,,
改为m_ev.events = EPOLLIN; //去掉EPOLLET就行了

我想问题应该解决了,,,
如果你非要使用ET触发的话,,那么读数据时,就一直读取,处理,再读取再处理,直到recv返回-1且errno =EAGAIN.然后才返回主循环epoll_wait。

数据不要轻易走pipe, 用pipe来做事件通知, 将待处理的数据包放在内存队列里, I/O线程也不用同步的等, 将待处理包丢给处理线程, 自己注册个write事件就可以继续干别的事了, 等处理线程处理完了把结果丢到队列里, 往I/O线程的pipe丢1字节就行了, I/O线程可以将结果对应的client的状态改为已完成, 等client的write事件再次触发就可以检测到已完成, 就可以继续往下干事了, 整个过程一定是可异步的.

实际优秀的设计是需要状态机这种简单的机制来帮助程序员解脱的, 而且绝大多数服务端也就是这么实现的, 一个client将会经历一系列的状态, 在一个状态逗留等待异步处理是完全可行的, 并且是不需要阻塞其他client的, 只要你保证给这个client一个等待超时检测或者你保证异步处理一定会有结果事件触发client.

lighttpd/nginx的设计就是一个典型的一应一答的协议, 但这不意味着就要阻塞等, 在接受到http请求后, 接下来注册write事件开始应答, 在write事件触发图书管理系统论文 后遍历所有callback module, 比如第一个module是vhost Module, 它会根据请求的port/host选择一个正确的文档根目录, 这个操作会立即成功, 于是继续下一个module的回调, 结果这一步是PHP CGI吧, 于是fork+pipe+dup2, 一套完事了, 注册监听pipe, 然后这个回调没有立即结束, 于是这次write事件结束. 之后就php cgi module在event loop里从pipe读数据放到client的output buffer里. 当然, client的write事件继续触发, 一方面将output buffer实际写出, 另一方面会继续回调php cgi module询问该module是否结束以便继续回调下一个module, 这就是client处于一个应答状态, 并且卡在php cgi上, 直到某一个pipe读完了, pipe的event callback会设置对应client的php cgi module的module data中的状态位为完成, 下一次client write事件触发回调php cgi module callback时, php cgi module就放行了. 就是这么一个过程. 不需要阻塞什么.

上一页  [1] [2] 

设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©chuibin.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。