ACE网络库内的send_n和recv_n问题

brightlife_cn 2014-07-24 11:11:52
网络上很多人用ace库中的send_n和recv_n程序会卡死,造成这一情况的原因可能是一次send_n了多条信息,recv_n来不及接收,造成了阻塞,我现在想在send_n一条数据到服务端的时候,服务端如果正常recv_n完毕信息,立马给客户端send_n的地方发个消息告诉已经接收完毕,然后客户端收到后再继续send_n,然后服务端也继续recv_n,这样相当于S型的交互,我现在send_n和recv_n都是在一个线程内写好的,请问有什么办法在recv_n接收完毕后给客户端说我已经接收完毕?
...全文
688 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-08-01
  • 打赏
  • 举报
回复
引用 10 楼 dcxy0 的回复:
[quote=引用 3 楼 zhao4zhong1 的回复:] 收端不recv或recv太慢,发端不管不顾地send,早晚会阻塞。且阻塞是再正常不过的事了。 男方不“哦”或“哦”的太少,女方不管不顾地“唠叨”,早晚会“失声”。且“失声”是再正常不过的事了。
这个比喻太贴切了、。、虽然不太懂[/quote] 意思就是在两端收发一大段数据,估计耗时会比较长的时候,收端应在较短时间内,通知发端已接收完一小段数据。
JPF1024 2014-08-01
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
收端不recv或recv太慢,发端不管不顾地send,早晚会阻塞。且阻塞是再正常不过的事了。 男方不“哦”或“哦”的太少,女方不管不顾地“唠叨”,早晚会“失声”。且“失声”是再正常不过的事了。
这个比喻太贴切了、。、虽然不太懂
赵4老师 2014-08-01
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
whoho 2014-07-29
  • 打赏
  • 举报
回复
这种阻塞通常是协议的通信时序没有设计好 你用recv_n读取的时候,应该知道需要读多少字节,否则人家已经发完了,你还继续等着,如果对方此刻不关闭连接 你当然只能在那白等——对方是在等你发些什么回去呢 如果你确定能知道你recv_n中,n是多少,那当然没有问题 否则就简单地调用recv/read吧 每个交互的包的包头、正文和包尾都应该定义好,是通过某些特定的字段表明包长,还是在设计协议的时候定死一个值 全部心里有数,按照这个规格去写程序,就不会出现这种阻塞问题啦
brightlife_cn 2014-07-29
  • 打赏
  • 举报
回复
CommonRecvFuncBase中部分代码 char buff[nBuffSize]; ACE_Time_Value timeout; timeout.set(dWaitTime); int size; while(1) { size = pStream->recv_n(buff,nBuffSize,&timeout); if(size == -1) { int __ace_error = ACE_Log_Msg::last_error_adapter (); if(__ace_error == 10054) break; if(__ace_error == 10038) break; else continue; } break; } sMessage = buff; if (sMessage.GetLength() > nBuffSize) { sMessage = sMessage.Left(nBuffSize); }
brightlife_cn 2014-07-29
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
收端不recv或recv太慢,发端不管不顾地send,早晚会阻塞。且阻塞是再正常不过的事了。 男方不“哦”或“哦”的太少,女方不管不顾地“唠叨”,早晚会“失声”。且“失声”是再正常不过的事了。
请问赵老师我该如何解决啊? 我是这么做的: 客户端发送请求后部分代码 while (1) { int n = pStream->send_n(buff,nBuffSize,0,&nowait); if (n == -1) { NetCommonDebug("发送客户端ID失败\n"); pMutex->release(); return -1; }else if (n == 0) { pMutex->release(); return 0; } double dWaitTime = 0; CString sMessage1=""; MessageRecvFuncBase(pStream,sMessage1,dWaitTime); if (sMessage1.CompareNoCase("ok") == 0) { break; } } 在这个MessageRecvFuncBase方法里,我recv_n获得传递的信息。但是经常出现的情况是send_n后,这边recv_n获取不到对方send_N的消息。 服务端接收到的代码: //第一步,接受客户端ID int size = CommonRecvFuncBase(pStream,buff,dWaitTime); if(size <= 0) return size; sClientID = buff; ACE_Time_Value nowait (ACE_Time_Value::zero); CString sRecvInfo="ok"; int n1 = pStream->send_n(sRecvInfo,nBuffSize,0,&nowait);
赵4老师 2014-07-24
  • 打赏
  • 举报
回复
收端不recv或recv太慢,发端不管不顾地send,早晚会阻塞。且阻塞是再正常不过的事了。 男方不“哦”或“哦”的太少,女方不管不顾地“唠叨”,早晚会“失声”。且“失声”是再正常不过的事了。
mujiok2003 2014-07-24
  • 打赏
  • 举报
回复
引用 1 楼 mujiok2003 的回复:
给别的线程发消息(不是windows消息)
2. 订阅者模式,告诉订阅者状态改变。
mujiok2003 2014-07-24
  • 打赏
  • 举报
回复
给别的线程发消息(不是windows消息)
wuweiquan123 2014-07-24
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
收端不recv或recv太慢,发端不管不顾地send,早晚会阻塞。且阻塞是再正常不过的事了。 男方不“哦”或“哦”的太少,女方不管不顾地“唠叨”,早晚会“失声”。且“失声”是再正常不过的事了。
赵老师真会举例子
brightlife_cn 2014-07-24
  • 打赏
  • 举报
回复
您好,我这个是客户端和服务端的程序,请问能给个例子不,就是服务端给客户端和客户端给服务端发消息线程的例子。
引用 1 楼 mujiok2003 的回复:
给别的线程发消息(不是windows消息)

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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