45fan.com - 路饭网

搜索: 您的位置主页 > 网络频道 > 阅读资讯:CAsyncSocket的OnSend应用有什么?

CAsyncSocket的OnSend应用有什么?

2016-08-26 16:25:40 来源:www.45fan.com 【

CAsyncSocket的OnSend应用有什么?

Client Socket刚连接会进入OnSend,表示可以发送数据了,
但程序中直接用Send就可以发送,
Send一次,大小有限制吗?还是不管多大都可以用一句Send全部发送呢?
我试了一下,一次发10MB都可以。
那OnSend到底有什么用?
但是我测试的结果是:
client socket->connect
然后触发client socket 的OnConnect和OnSend
这时并没有调用Send
然后我调用Send( buf, 100000000 );
就一下子全发送过去了
OnSend再也没有触发过


你直接调用send,在异步下面,一般是直接返回WSAEWOULDBLOCK,
如果成功发送的话,返回发送的字节数目,
如果你需要发送大量的数据,你怎么捕获发送一般以后突然发生的错误,比如突然有人踢掉了你的网线
所以,一般在onSend里写(msdn上的)
void CMyAsyncSocket ::OnSend(int nErrorCode)
{
while (m_nBytesSent < m_nBytesBufferSize)
{
int dwBytes;

if ((dwBytes = Send((LPCTSTR)m_sendBuffer + m_nBytesSent,
m_nBytesBufferSize - m_nBytesSent)) == SOCKET_ERROR)
{
if (GetLastError() == WSAEWOULDBLOCK) break;
else
{
TCHAR szError[256];
wsprintf(szError, "Server Socket failed to send: %d ",
GetLastError());
Close();
AfxMessageBox (szError);
}
}
else
{
m_nBytesSent += dwBytes;
}
}
if (m_nBytesSent == m_nBytesBufferSize)
{
m_nBytesSent = m_nBytesBufferSize = 0;
m_sendBuffer = " ";
}
CAsyncSocket::OnSend(nErrorCode);
}

然后要发送的时候,把数据copy 到m_sendBuffer中,然后调一下AsyncSelect( FD_WRITE );触发onsend

回复人:ahao(天·狼·星星) () 信誉:97 2002-9-7 16:32:56 删除

但是OnSend应该是WinSock的内部发送缓冲区可用时,系统激发的消息,
如果不理会它,直接发会不会有问题?
在OnSend里发可能更正确点吧?各位有什么建议?
还有就是,除了用AsyncSelect(FD_WRITE);
系统到底什么时候会激发OnSend消息呢?

---

看来只能这样,不过总觉得MFC对OnSend的定义很模糊。
 


本文地址:http://www.45fan.com/a/question/68024.html
Tags: Client CAsyncSocket OnSend
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部