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的定义很模糊。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值