关于 CAsyncSocket Send 的一个小问题!!!!!!!! 马上给分

surnde4 2007-09-15 10:14:28
使用 CAsyncSocket 异步类,连接好后,在程序需要的时候 开调用send 发送数据。(可能会循环发送很多数据 量不大但是发送的次数可能会很多)

在局狱网中 测试良好,在Internet上测试,发现接收端 有很多包没有接受得到,但是连接却是正常的。

注:为了性能,我发送的数据并不需要接受端发来确认。

看了MSDN的资料,Send(buf,len) 会返回

==len,这个最好了
==SOCKET_ERROR 这种情况又要处理下面的
{
GetLastError() =
WSAEWOULDBLOCK //我理解为忙,但是数据已经复制到缓冲区,等会系统会自动帮你发
不是WSAEWOULDBLOCK //我理解为网络出错。
}
最后一种是 < len //这个这么处理?难道我要循环发送没有发完的数据?


MSDN 上是在OnSend里处理的,如果在我的程序里这样做,我根本不知道这个OnSend是发送哪块数据返回的。

我要怎么处理啊?

...全文
159 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
孙泳勇 2007-09-16
  • 打赏
  • 举报
回复
连续发送时缓冲区已经不够用了
可以在缓冲区可写后再继续发送
surnde 2007-09-16
  • 打赏
  • 举报
回复
这个问题,我自己已经解决了!!

< len ,才是部分完成,剩下的系统会帮你完成。(换句话说,出现这个问题,你可以不用理睬)
GetLastError() =
WSAEWOULDBLOCK // 这个才是问题的关键 缓冲区满,发送不成功。 这个你需要重新循环发送,知道成功,当然这时候你就变成了非阻模式了。
coldplay968 2007-09-16
  • 打赏
  • 举报
回复
len的长度 也就是buf的长度
Leo_Panda 2007-09-16
  • 打赏
  • 举报
回复
最后一种是 < len //这个这么处理?难道我要循环发送没有发完的数据?

没看懂

Send(buf,len) len填的是实际需要发送的长度
Yofoo 2007-09-15
  • 打赏
  • 举报
回复

以前用过循环接收的

int ReceiveNBytes(char * buf, int n, int len, int flags)
{
int iOnceSize = 0, iOnceLen = 0, iDoneSize = 0;
if(len < n)
{
LogOut("Assert in %s: %d.\n", __FILE__, __LINE__);
return -1;
}
if(n <= 0)
{
return 0;
}
for(;;)
{
iOnceLen = n - iDoneSize;
if(iOnceLen <= 0)
{
LogOut("ReceiveNBytes - Cannot receive Zero bytes.");
return -1;
}
iOnceSize = Receive(buf + iDoneSize, iOnceLen, flags);
if(iOnceSize <= 0 || iOnceSize > n)
{
LogOut("ReceiveNBytes - Received ZERO or less bytes or greater");
}
iDoneSize += iOnceSize;
if(iDoneSize >= n)
break;
}
return iOnceSize;
}

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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