CAsyncSocket的OnSend应用有什么?
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的定义很模糊。