OnConnect碰到FD_Read,程序是自动执行OnSend(表示可以发数据),还是根据FD_Read调用OnReceive()函数内容。

所罗门EQ 2013-08-13 11:24:16
请教各位大侠,
客户端在第一次调用
void socket::onconnect()
{ ...
AsyncSelelct(FD_Read);
...
}
程序是自动执行OnSend,表示可以发数据了,还是根据FD_Read调用OnReceive()函数内容。
...全文
284 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zj0789 2013-08-17
  • 打赏
  • 举报
回复
引用 4 楼 u011687911 的回复:
MFC中客户端socket在建立完成后经过connect()函数连接上服务端,会自动触发Onconnect()函数表示连接完成。然后缓冲区为空应该自动触发OnSend()函数,表示可以发送数据了。可是,我在Onconnect函数里加上手动事件申请AsyncSelelct(FD_Read),应该会触发OnReceive()函数。。。要问的是,这个程序段中,当Onconnect表明连接完成后,程序接下来的工作是默认的促发OnSend()函数,还是根据程序触发OnReceive()函数。谢谢
应该是在CSocket.OnSend()中调用CSocket.Send() 跟Recieve的过程是一样的。
// CMyAsyncSocket is derived from CAsyncSocket and defines the 
// following variables:
//    CString      m_sendBuffer;   //for async send
//    int      m_nBytesSent;
//    int      m_nBytesBufferSize;

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);
}

zj0789 2013-08-17
  • 打赏
  • 举报
回复
引用 5 楼 u011687911 的回复:
[quote=引用 3 楼 spirit008 的回复:] 没看懂你要问什么。流程就是,你先尝试调用发送,看send返回值,如果发送成功,你可以继续调用发送。如果发送失败,但错误表示异步等待(ewouldblock),则需等onsend,才能再次send
MFC中客户端socket在建立完成后经过connect()函数连接上服务端,会自动触发Onconnect()函数表示连接完成。然后缓冲区为空应该自动触发OnSend()函数,表示可以发送数据了。可是,我在Onconnect函数里加上手动事件申请AsyncSelelct(FD_Read),应该会触发OnReceive()函数。。。要问的是,这个程序段中,当Onconnect表明连接完成后,程序接下来的工作是默认的促发OnSend()函数,还是根据程序触发OnReceive()函数。谢谢[/quote] 调用CSocket.Send(),才会触发CSocket.OnSend()函数吧
木头菇 2013-08-17
  • 打赏
  • 举报
回复
引用 7 楼 u011687911 的回复:
没人知道吗。求大神
异步都是请求应答式,你不调用相关动作就不会有相关事件通知。你调用了如果没有事件到来也不会有通知。
所罗门EQ 2013-08-17
  • 打赏
  • 举报
回复
引用 10 楼 zj0789 的回复:
[quote=引用 4 楼 u011687911 的回复:] MFC中客户端socket在建立完成后经过connect()函数连接上服务端,会自动触发Onconnect()函数表示连接完成。然后缓冲区为空应该自动触发OnSend()函数,表示可以发送数据了。可是,我在Onconnect函数里加上手动事件申请AsyncSelelct(FD_Read),应该会触发OnReceive()函数。。。要问的是,这个程序段中,当Onconnect表明连接完成后,程序接下来的工作是默认的促发OnSend()函数,还是根据程序触发OnReceive()函数。谢谢
应该是在CSocket.OnSend()中调用CSocket.Send() 跟Recieve的过程是一样的。 可是我在Onconnect函数体中末尾提出了事件申请AsyncSelect(FD_READ),那Onconnect执行完了之后,程序还是继续默认执行OnSend函数?
所罗门EQ 2013-08-17
  • 打赏
  • 举报
回复
引用 8 楼 spirit008 的回复:
[quote=引用 7 楼 u011687911 的回复:] 没人知道吗。求大神
异步都是请求应答式,你不调用相关动作就不会有相关事件通知。你调用了如果没有事件到来也不会有通知。[/quote] 那connect完成后,怎么触发OnConnect函数(表明连接完成)
所罗门EQ 2013-08-15
  • 打赏
  • 举报
回复
没人知道吗。求大神
木头菇 2013-08-14
  • 打赏
  • 举报
回复
没看懂你要问什么。流程就是,你先尝试调用发送,看send返回值,如果发送成功,你可以继续调用发送。如果发送失败,但错误表示异步等待(ewouldblock),则需等onsend,才能再次send
Eleven 2013-08-14
  • 打赏
  • 举报
回复
引用 4 楼 u011687911 的回复:
MFC中客户端socket在建立完成后经过connect()函数连接上服务端,会自动触发Onconnect()函数表示连接完成。然后缓冲区为空应该自动触发OnSend()函数,表示可以发送数据了。可是,我在Onconnect函数里加上手动事件申请AsyncSelelct(FD_Read),应该会触发OnReceive()函数。。。要问的是,这个程序段中,当Onconnect表明连接完成后,程序接下来的工作是默认的促发OnSend()函数,还是根据程序触发OnReceive()函数。谢谢
CAsyncSocket::OnReceive () Called by the framework to notify this socket that there is data in the buffer that can be retrieved by calling the Receive member function.
所罗门EQ 2013-08-14
  • 打赏
  • 举报
回复
引用 3 楼 spirit008 的回复:
没看懂你要问什么。流程就是,你先尝试调用发送,看send返回值,如果发送成功,你可以继续调用发送。如果发送失败,但错误表示异步等待(ewouldblock),则需等onsend,才能再次send
MFC中客户端socket在建立完成后经过connect()函数连接上服务端,会自动触发Onconnect()函数表示连接完成。然后缓冲区为空应该自动触发OnSend()函数,表示可以发送数据了。可是,我在Onconnect函数里加上手动事件申请AsyncSelelct(FD_Read),应该会触发OnReceive()函数。。。要问的是,这个程序段中,当Onconnect表明连接完成后,程序接下来的工作是默认的促发OnSend()函数,还是根据程序触发OnReceive()函数。谢谢
所罗门EQ 2013-08-14
  • 打赏
  • 举报
回复
MFC中客户端socket在建立完成后经过connect()函数连接上服务端,会自动触发Onconnect()函数表示连接完成。然后缓冲区为空应该自动触发OnSend()函数,表示可以发送数据了。可是,我在Onconnect函数里加上手动事件申请AsyncSelelct(FD_Read),应该会触发OnReceive()函数。。。要问的是,这个程序段中,当Onconnect表明连接完成后,程序接下来的工作是默认的促发OnSend()函数,还是根据程序触发OnReceive()函数。谢谢
所罗门EQ 2013-08-13
  • 打赏
  • 举报
回复
求解答啊。。。。。。。。。
所罗门EQ 2013-08-13
  • 打赏
  • 举报
回复
void CMySock::OnConnect(int nErrorCode)
{
if (nErrorCode=0)
{
m_bConnected=TRUE;
CCSockClientApp* pApp=(CCSockClientApp*)AfxGetApp();
CCSockClientDlg* pDlg=(CCSockClientDlg*)pApp->m_pMainWnd;
memcpy(m_szBuffer,"Connected to",13);
strncat(m_szBuffer,pDlg->m_szServerAdr,sizeof(pDlg->m_szServerAdr));
pDlg->m_MSGS.InsertString(0,m_szBuffer);
AsyncSelect(FD_READ);
}
CAsyncSocket::OnConnect(nErrorCode);
}

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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