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

TCP接受数据问题?当一次到达的数据长度大于接受设置的最大长度时怎么办?

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

    本文导语:  我的TCP服务器接受数据长度最大设置1500  接受的buffer也是1500   但是当来的网络上来的数据大于1500(也就是recv返回的长度是1500)的时候 我发现数据有丢失  这是什么原因了?   当我都设置成15000数据才没有丢失...

我的TCP服务器接受数据长度最大设置1500  接受的buffer也是1500   但是当来的网络上来的数据大于1500(也就是recv返回的长度是1500)的时候 我发现数据有丢失  这是什么原因了?
 
当我都设置成15000数据才没有丢失 因为这个时候没有一次性来的数据是超过15000的

还有即使我把接受数据的buffer设置的很大比如15000,接受最大长度还是1500 依然当网络上来的数据大于1500的时候会发现有数据丢失,
 
总之:我发现只要一次性来的数据大于最大长度就会 有丢失数据的情况

求各位大神解答疑惑  感激不尽!

|
哦,,对对,有这种可能就是:你用的epoll是工作有ET模式下,而你又的传进去的buffer不够大的时候,一次读不完,即状态不改变,然后下次用epoll_wait时就一直等不到通知了。

LZ看看你是否用的epoll的ET模式。

|
数据不要轻易走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就放行了. 就是这么一个过程. 不需要阻塞什么.

|
问题应该在接收端。用epoll要注意ET和LT。

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












  • 相关文章推荐
  • 控制在网络上传输TCP数据包的大小的问题
  • netfilter里如何获得TCP包的数据?
  • tcp协议会出现丢包或者数据错误吗?
  • TCP发送数据,假如发送套接口是非阻塞的,而要发送的数据大于缓冲区尺寸
  • TCP数据流抓取程序 tcpflow
  • 请问如何设计tcp数据包啊??
  • tcp数据包发出后目标机器没有回复
  • 如何实现对网络协议栈(TCP/IP)各层数据的提取?!
  • TCP连接如何获取当前Sender buffer中已经缓存的数据量
  • 使用tcp协议发送数据, 如果获得系统底层将包发到客户端之间的耗时?
  • 急!如何监听并且重组网络中的TCP数据流?
  • 传入一个sk_buff的结构,如何获取tcp的端口和其它数据
  • 急,请教一个将TCP数据包修改为UDP包的问题,高手请进!
  • 删除掉tcp/ip协议栈后,在网卡中直接取数据应该怎么做
  • 本来可以修改skb里tcp数据的,突然不能修改了,为什么?
  • 求助:协议族各属于5层TCP/IP模型中的哪个层?(这里物理层和数据链路层是分开的)
  • Java里基于TCP/IP的Socket通信中一帧数据最好是多大(内详)
  • 如何在UNIX 和 WINDOWS 平台之间进行数据传输,使用TCP/IP 通信协议
  • 求一个使用tcp协议传送类似数据库表的二维数组的例子。每条记录上的字段数据类型不一定一样。
  • TCP连接中创建的监听描述字和已连接描述字(套接字)对应的是同一个套接口么,如果是的话,读写数据时系统怎么区分是哪个套接字的?
  • java命名空间java.net接口socketoptions的类成员方法: tcp_nodelay定义及介绍
  • http走的是tcp还是udp?ssh是tcp还是udp?
  • Linux内核中影响tcp三次握手的一些协议配置
  • 100分求《嵌入式系统Web服务器—TCP/IP Lean》或《TCP/IP Lean Web Servers for Embedded Systems 》
  • TCP协议报头字段详解及报头图
  • tcp和udp套接字有何不同?在什么情况下用tcp什么情况下用udp????
  • 对TCP协议状态及状态转换理解
  • tcp_prequeue_process怎么调用了tcp_v4_do_rcv的??求解??在tcp_recvmsg调用的
  • TCP协议四次断连过程介绍及Linux内核协议栈中相关设置项
  • 请问怎么知道每个TCP连接所属哪个进程??还有怎么样断开系统中任意一个TCP连接?
  • TCP协议三次握手过程详解


  • 站内导航:


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

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

    浙ICP备11055608号-3