socket 发送端采用阻塞方式,接收端用非阻塞方式?

chmdcr 2011-04-01 11:53:40
写一个对数据发送和接收的程序
发送端用阻塞方式发送数据
接收端用非阻塞方式

发送周期比较大 5秒左右


现在的问题是
在数据传输一段时间后 接收端的OnRecive函数突然就接不到通知了 不知道为什么 添加了输出显示 上一次接收肯定已经把发送出来的所有字节都收到了(因为包头包尾都对上了才能进行下面的流程)

这样的话 已发送发送几次数据而接收端不接收的话 那么发送端就阻塞了

为什么OnRecive偶尔会无法收到通知呢??
...全文
384 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
三重罗生门 2011-04-15
  • 打赏
  • 举报
回复
CAsyncSocket本来就是一个异步I/O模型
CppCoder 2011-04-14
  • 打赏
  • 举报
回复
个人认为
还是表依赖CAsyncSocket的消息循环了,自己Asyncselect分发事件好些
仅供参考
theflyfish 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 chmdcr 的回复:]

把你的问题整理一下完整的描述吧 越看越晕 我都不知道你的问题是不是和我是一个问题
[/Quote]
很简单,就说说你的问题怎么解决的吧,具体实现,
chmdcr 2011-04-14
  • 打赏
  • 举报
回复
把你的问题整理一下完整的描述吧 越看越晕 我都不知道你的问题是不是和我是一个问题
chmdcr 2011-04-13
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 theflyfish 的回复:]
我也碰到过这样的问题。。。楼主问题解决了没,求解释
[/Quote]

我原来认为CAsyncSocket应该默认的就是异步的 所以没必要再掉Asyncselect
但尝试着又加了一次Asyncselect 就没再出错过
目前看来就算是解决了 但是想不明白 等高手解答
theflyfish 2011-04-13
  • 打赏
  • 举报
回复
theflyfish 2011-04-13
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 chmdcr 的回复:]

引用 18 楼 theflyfish 的回复:
Asyncselect是在ONReceive里面加的,还是在其他地方加的?是Asyncselect(FD_READ)?
我也碰到了这个郁闷的问题,本来想在ONReceive()加一个无限FOR()循环,把recv函数放在循环里,但看来还是不能解决问题,楼主详细说一下吧,菜鸟谢过了

哎。。。。。我这是提问的帖子还是 回答的帖子啊?
你为什……
[/Quote]
楼主好人,说一下你的思路吧,要不我开个贴,你来回答好不,
chmdcr 2011-04-13
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 theflyfish 的回复:]
Asyncselect是在ONReceive里面加的,还是在其他地方加的?是Asyncselect(FD_READ)?
我也碰到了这个郁闷的问题,本来想在ONReceive()加一个无限FOR()循环,把recv函数放在循环里,但看来还是不能解决问题,楼主详细说一下吧,菜鸟谢过了[/Quote]

哎。。。。。我这是提问的帖子还是 回答的帖子啊?
你为什么要用无限FOR循环?
如果用无限FOR循环就另开一个线程 不要放在ONRECEIVE里
theflyfish 2011-04-13
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 chmdcr 的回复:]

引用 16 楼 theflyfish 的回复:
我也碰到过这样的问题。。。楼主问题解决了没,求解释


我原来认为CAsyncSocket应该默认的就是异步的 所以没必要再掉Asyncselect
但尝试着又加了一次Asyncselect 就没再出错过
目前看来就算是解决了 但是想不明白 等高手解答
[/Quote]
Asyncselect是在ONReceive里面加的,还是在其他地方加的?是Asyncselect(FD_READ)?
我也碰到了这个郁闷的问题,本来想在ONReceive()加一个无限FOR()循环,把recv函数放在循环里,但看来还是不能解决问题,楼主详细说一下吧,菜鸟谢过了
至善者善之敌 2011-04-11
  • 打赏
  • 举报
回复
发送端非阻塞,接受也是非阻塞
chmdcr 2011-04-11
  • 打赏
  • 举报
回复
没有人答复了?
theflyfish 2011-04-11
  • 打赏
  • 举报
回复
我也碰到过这样的问题。。。楼主问题解决了没,求解释
chmdcr 2011-04-06
  • 打赏
  • 举报
回复
在接收端加了个Asyncselect 已经跑了3天了 居然没断过 神奇了
chmdcr 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wuliaoxuebiancheng 的回复:]
引用 3 楼 chmdcr 的回复:
引用 2 楼 xianglitian 的回复:
你用的是CSocket?
具体怎么实现的

接收端用CAsyncSocket 发送端直接用socket api

接收端应用层收不到数据,发送端也不会阻塞的吧,接收端也用api算了,简单易懂
[/Quote]

要是我写的程序 我早换了
chmdcr 2011-04-02
  • 打赏
  • 举报
回复
TCP的
输出的结果看
就是因为接收端突然收不到ONRECEIVE通知了 然后不在读取缓冲区的数据
而在这之后 发送端再发送几次数据后估计缓冲区满了 他就阻塞在send函数那里不动了
一直有判断send的返回值 肯定是想要发的都发出去了

我 尝试人为的暂停接收端 发送端确实会在发送几次后就阻塞在send函数那里 当我恢复接收端继续接收数据后 发送端会恢复正常执行

现在问题目前就定在为什么接收端会突然的就收不到ONReceive的通知了呢 CAsyncSocket应该默认的就是异步的 所以没必要再掉Asyncselect吧 退一步讲 如果是因为这个问题 程序也不可能执行这么长时间 应该很快就出问题的
Eleven 2011-04-02
  • 打赏
  • 举报
回复
你要先确定是你发送端还是接收端的问题,抓个包看看数据有没有发送出去,或者数据有没有到达接收端?
向立天 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wuliaoxuebiancheng 的回复:]

引用 3 楼 chmdcr 的回复:
引用 2 楼 xianglitian 的回复:
你用的是CSocket?
具体怎么实现的

接收端用CAsyncSocket 发送端直接用socket api

接收端应用层收不到数据,发送端也不会阻塞的吧,接收端也用api算了,简单易懂
[/Quote]
对呀
不会发生所谓发送阻塞的问题吧
你先做个简单模型看看会不会出问题
然后再一点点的加大复杂度
或者通过一种方式看看发送端会不会有其他问题
向立天 2011-04-01
  • 打赏
  • 举报
回复
你用的是CSocket?
具体怎么实现的
smwhotjay 2011-04-01
  • 打赏
  • 举报
回复
话说,你还没理解socket. 再仔细看
西湖秀才 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chmdcr 的回复:]
引用 2 楼 xianglitian 的回复:
你用的是CSocket?
具体怎么实现的

接收端用CAsyncSocket 发送端直接用socket api
[/Quote]
接收端应用层收不到数据,发送端也不会阻塞的吧,接收端也用api算了,简单易懂
加载更多回复(4)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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