关于TCP包的小问题

whiteclouds 2007-01-18 08:59:35
我用tcp向linux的程序发送10k左右的数据,linux下我使用1k的缓冲区来接收,由于处理时间比较长,总是处理不对。可我并不能用和发送数据一样大小的缓冲区来接收,发送数据长度是变化的,而且不能预测,最多可能达到4M左右。我应该怎么处理呢?
...全文
305 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
whiteclouds 2007-01-26
  • 打赏
  • 举报
回复
我搞错了,我的问题不是TCP丢包造成的,而是发送端程序的bug没有把数据发完造成的。谢谢楼上的热心人。
qdhuxp 2007-01-22
  • 打赏
  • 举报
回复
"第一个包的最后包含一个数据结构的前半部分,我的分析函数已经处理并退出等待第二个包了,可程序就再也没有响应了"
-----------------
我猜想程序没有响应的原因是,端口占用,没有设置复用端口。这虽然是小问题,但有可能是本题的问题。
我认为好的数据结构和算法能够使程序更易实现、维护和扩展。按照bluedreammer(瀟瀟鳥) 的算法有可能会更好一些。
whiteclouds 2007-01-22
  • 打赏
  • 举报
回复
我使用realloc解决这个问题,也许还有更好的办法,楼上的办法我需要对现有程序进行大规模改动,几乎是完全重新作,肯定不行的。
bluedreammer 2007-01-22
  • 打赏
  • 举报
回复
可否这样,建立 buffer queue的机制。
即:Socket的数据接收是单独的一个线程或者进程,另外需要分析寻找完整的数据包。
一旦有完整的数据包,则将这个完整的包入队(如果包长不确定,可以采用动态分配的内存,当然更好的方式可以控制内存的总长度,溢出便舍弃最先入队的数据),从而建立一个数据包的Queue。
数据处理部分可以重新开一个线程,此线程Polling判断当前队列是否有数据,如果有,出队处理。
我想如果这样,应该不会有什么问题,逻辑上也很清楚的。
whiteclouds 2007-01-19
  • 打赏
  • 举报
回复
我的运行环境不许我创建文件,是嵌入式的,所以楼上的办法行不通。这个方案我已经用过,虽然可行但已经被否定。希望能得到别的方案提示
stoneme 2007-01-19
  • 打赏
  • 举报
回复
一般我们不这样处理数据

如果包非常小而且长度基本在一定范围内可以这样,但要求缓冲区大于最大数据长度再加一点
如果包很大,处理较慢就先把它存起来,如存到文件里,然后再用另外一个进程去处理
至于报文何时结束就要看你怎么定义的接口了不般不用解析包内容是否完整的方法处理
xfzhao_cn 2007-01-18
  • 打赏
  • 举报
回复
首先要明确一个观点,你每次读1k,不一定都能读到,你要确认返回值,因为TCP是稳定和可靠的,
你一直这么读,一定能完的
zhendeyue 2007-01-18
  • 打赏
  • 举报
回复
请楼主帮帮忙,我也在搞TCP/IP,但一直没有头绪,能否请楼主指教一下,非常感谢!
我的联系方式:uaohuyue@126.com qq:396052791一定要说明你是谁啊,不然我不加的。
darkone 2007-01-18
  • 打赏
  • 举报
回复
另外开辟一个大的缓存,4M也不算大,我这里的缓存有几百M,SOCKET只负责接收,收到的数据扔进去就可以了
kangji 2007-01-18
  • 打赏
  • 举报
回复
“由于处理时间比较长,总是处理不对”
哪里不对,报错了没?超时了没?
whiteclouds 2007-01-18
  • 打赏
  • 举报
回复
情况是这样:
我每次接到1k数据,就去分析处理,由于数据是有格式的,可能出现一个完整的数据被分在两个包里发送,我的程序每次都要分析是否存在这种情况。出现则分析函数就退出等待下一个包。
每次调试我都是把全部测试数据一次发出,第一个包的最后包含一个数据结构的前半部分,我的分析函数已经处理并退出等待第二个包了,可程序就再也没有响应了。
如果我把缓冲设为和数据一样大,就不存在这个问题。程序很流畅的执行。
如果tcp不会丢包,为什么我的程序会死掉呢?

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧