日期:2014-05-16  浏览次数:20654 次

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

------解决方案--------------------
另外开辟一个大的缓存,4M也不算大,我这里的缓存有几百M,SOCKET只负责接收,收到的数据扔进去就可以了
------解决方案--------------------
首先要明确一个观点,你每次读1k,不一定都能读到,你要确认返回值,因为TCP是稳定和可靠的,
你一直这么读,一定能完的
------解决方案--------------------
一般我们不这样处理数据

如果包非常小而且长度基本在一定范围内可以这样,但要求缓冲区大于最大数据长度再加一点
如果包很大,处理较慢就先把它存起来,如存到文件里,然后再用另外一个进程去处理
至于报文何时结束就要看你怎么定义的接口了不般不用解析包内容是否完整的方法处理
------解决方案--------------------
可否这样,建立 buffer queue的机制。
即:Socket的数据接收是单独的一个线程或者进程,另外需要分析寻找完整的数据包。
一旦有完整的数据包,则将这个完整的包入队(如果包长不确定,可以采用动态分配的内存,当然更好的方式可以控制内存的总长度,溢出便舍弃最先入队的数据),从而建立一个数据包的Queue。
数据处理部分可以重新开一个线程,此线程Polling判断当前队列是否有数据,如果有,出队处理。
我想如果这样,应该不会有什么问题,逻辑上也很清楚的。

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