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

关于TCP包的小问题

    来源: 互联网  发布时间:2016-01-07

    本文导语:  我用tcp向linux的程序发送10k左右的数据,linux下我使用1k的缓冲区来接收,由于处理时间比较长,总是处理不对。可我并不能用和发送数据一样大小的缓冲区来接收,发送数据长度是变化的,而且不能预测,最多可能达...

我用tcp向linux的程序发送10k左右的数据,linux下我使用1k的缓冲区来接收,由于处理时间比较长,总是处理不对。可我并不能用和发送数据一样大小的缓冲区来接收,发送数据长度是变化的,而且不能预测,最多可能达到4M左右。我应该怎么处理呢?

|
可否这样,建立 buffer queue的机制。
即:Socket的数据接收是单独的一个线程或者进程,另外需要分析寻找完整的数据包。
一旦有完整的数据包,则将这个完整的包入队(如果包长不确定,可以采用动态分配的内存,当然更好的方式可以控制内存的总长度,溢出便舍弃最先入队的数据),从而建立一个数据包的Queue。
数据处理部分可以重新开一个线程,此线程Polling判断当前队列是否有数据,如果有,出队处理。
我想如果这样,应该不会有什么问题,逻辑上也很清楚的。

|
一般我们不这样处理数据

如果包非常小而且长度基本在一定范围内可以这样,但要求缓冲区大于最大数据长度再加一点
如果包很大,处理较慢就先把它存起来,如存到文件里,然后再用另外一个进程去处理
至于报文何时结束就要看你怎么定义的接口了不般不用解析包内容是否完整的方法处理

|
"第一个包的最后包含一个数据结构的前半部分,我的分析函数已经处理并退出等待第二个包了,可程序就再也没有响应了"
-----------------
我猜想程序没有响应的原因是,端口占用,没有设置复用端口。这虽然是小问题,但有可能是本题的问题。
我认为好的数据结构和算法能够使程序更易实现、维护和扩展。按照bluedreammer(瀟瀟鳥) 的算法有可能会更好一些。

|
首先要明确一个观点,你每次读1k,不一定都能读到,你要确认返回值,因为TCP是稳定和可靠的,
你一直这么读,一定能完的

|
另外开辟一个大的缓存,4M也不算大,我这里的缓存有几百M,SOCKET只负责接收,收到的数据扔进去就可以了

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












  • 相关文章推荐
  • 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协议三次握手过程详解
  • 高分求救:SOL_SOCKET,SO_RCVTIMO,SO_SNDTIMEO,IPPOTO_TCP,TCP_NODELAY这些是在哪个头文件定义的呢?
  • TCP/IP协议族介绍及TCP/IP协议族中各协议对应的RFC编号
  • 请问RST在什么情况下发送?? 使用TCP socket编程的话是否会引起这种TCP包的发送?
  • netfilter里如何获得TCP包的数据?
  • linux内核tcp重组的函数?
  • 转发 TCP/IP 连接 prtunnel
  • tcp的分节表示什么?
  • 如何在Linux系统上运行T/TCP程序
  • SCO Openserver 5 TCP/IP
  • 关于tcp/ip详解卷2中的代码


  • 站内导航:


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

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

    浙ICP备11055608号-3