找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4493|回复: 3

请问一个关于网络通信中的一个发送数据buffer满的问题

[复制链接]
发表于 2008-9-21 15:11:41 | 显示全部楼层 |阅读模式
请问一个关于网络通信中的一个发送数据buffer满的问题
我的程序与老外做的程序相连,我的程序运行在windows上,老外的程序运行在linux上,
我们双方通信的协议是定义了一个字符串的开头和结尾是特殊字符,然后我这边每次recv一个char,
然后当收到了开头和结尾时,就将这俩个标志之间的数据提取,然后进行相关操作
但我们在通信比较繁忙的时候,即双方的通信数据很多,一秒可能会有20条或更多的字符串,每个字符串大概2000-3000个char
这样老外和我的程序就出现了错误,老外的程序显示是send buff full;
而我这边的函数recv也显示错误,于是重新连接,请问这是怎么回事
我知道tcp在windows上会有一个buffer,但是我该如何操作这个buffer呢?就是使用setsocketopt的那个函数吗?
还有,这是我的问题吗?
 楼主| 发表于 2008-9-21 15:11:47 | 显示全部楼层
从现象来看,好像你的程序收取、处理数据速度太慢,两边不同步导致。
你是收取数据后,就开始处理的吗?还是采取网络收取和数据处理分离的策略?
 楼主| 发表于 2008-9-21 15:11:59 | 显示全部楼层
我在做一个文件上传得服务器和客户端时,客户端将文件上传到服务器,服务段接收到数据后将数据放到另一个线程的消息队列中,就是Task-〉putq(mb)

那个处理数据的线程在一个while循环中不断的从消息队列中取消息,==〉进行长时间的业务处理(存储数据到文件或者将一些信息进行数据库的操作)

整个程序一个主线程不断接受客户端的连接和接收数据,(可以是异步),

第二个线程进行真正的业务处理

一共两个线程,我的程序的主线程运行ACE_Proactor::instance()->run_proactor_event_loop()

也可以开一个线程池, 在线程池中运行异步事件循环~
 楼主| 发表于 2008-9-21 15:12:08 | 显示全部楼层
建议你不要采用一次接受一个字节的方式,而是接受批量数据,然后在其他函数中处理这些数据,这样应该就没有问题了。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-22 21:14 , Processed in 0.019001 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表