CAsyncSocket的OnReceive函数执行是不是一定要个窗口对象来触发?如果是Win32 Console Application的工程,该怎么让它触发呢?

解决方案 »

  1.   

    CAsyncSocket在内部会自己创建一个窗口的。FD_READ?
      

  2.   

    调用了这个的呀:
    cSock->AsyncSelect(FD_READ | FD_WRITE | FD_CLOSE | FD_CONNECT | FD_OOB);
      

  3.   

    把代码贴出来,大家帮我看看啊:
    有个CClientSocket类,继承CAsyncSocket,里面有OnReceive、OnConnect等函数,是用classWizard自动生成的。
    然后在程序里用下面这段来调用: AfxSocketInit();
    BOOL bOK;
    CClientSocket * cSock = new CClientSocket();
    if(cSock != NULL)
    {
    bOK = cSock->Create();
    if(bOK == TRUE)
    {
    cSock->AsyncSelect(FD_READ | FD_WRITE | FD_CLOSE | FD_CONNECT | FD_OOB);
    cSock->Connect("towel.blinkenlights.nl", 23);
    Sleep(90);
    }
    else
    {
    ASSERT(FALSE);  //Did you remember to call AfxSocketInit()?
    delete cSock;
    cSock = NULL;
    }
    }connect后,OnConnect没有被执行到。
      

  4.   

    看看下面的你就知道啦转载:
    -------------------
    FD_WRITE 相对来说就麻烦一些. 首先, 当你建立了一个连接时, 会产生一个 FD_WRITE 事件. 但是如果你认为在收到 FD_WRITE 时调用 send() 就万事大吉, 那就错了. FD_WRITE 事件只在发送缓冲区有多出的空位, 可以容纳需要发送的数据时才会触发.上面所谓的发送缓冲区,是指系统底层提供的缓冲区. send() 先将数据写入到发送缓冲区中, 然后通过网络发送到接收端. 你或许会想, 只要不把发送缓冲区填满, 让发送缓冲区保持足够多的空位容纳需要发送的数据, 那么你就会源源不断地收到 FD_WRITE 事件了. 嘿嘿, 错了.上面只是说 FD_WRITE 事件在发送缓冲区有多出的空位时会触发, 但不是在有足够的空位时触发, 就是说你得先把发送缓冲区填满.通常的办法是在一个无限循环中不断的发送数据, 直到把发送缓冲区填满. 当发送缓冲区被填满后, send() 将会返回 SOCKET_ERROR , WSAGetLastError() 会返回 WSAWOULDBLOCK . 如果当前这个 SOCKET 处于阻塞(同步)模式, 程序会一直等待直到发送缓冲区空出位置然后发送数据; 如果SOCKET是非阻塞(异步)的,那么你就会得到 WSAWOULDBLOCK 错误. 于是只要我们首先循环调用 send() 直到发送缓冲区被填满, 然后当缓冲区空出位置来的时候, 系统就会发出FD_WRITE事件. 有没有想过我能指出这一点来是多么不容易, 你可真走运. 下面是一个处理 FD_WRITE 事件的例子.case FD_WRITE:  // 可以发送数据了
      {
        // 进入无限循环
        while(TRUE)
        {
          // 从文件中读取数据, 保存到 packet.data 里面.
          in.read((char*)&packet.data, MAX_PACKET_SIZE);      // 发送数据
          if (send(wparam, (char*)(&packet), sizeof(PACKET), 0) == SOCKET_ERROR)
          {
            if (WSAGetLastError() == WSAEWOULDBLOCK)
            {
              // 发送缓冲区已经满了, 退出循环.
              break;
            }
            else // 其他错误
            {
              // 显示出错信息然后退出.
              CleanUp();
              return(0);
            }
          }
        }
      } break;
      

  5.   

    可能我没说清楚,现在的问题是,通信都很正常,如果直接用cSock->Receive可以接收数据,cSock->Send也正常,但就是OnXxx函数不能被调用
      

  6.   

    OnConnect是你重载CAsyncSocket的OnConnect事件???
    都能收发,说明连接成功了啊!我有一个问题:我服务器端,可以收发几次后,就收不到客户端发来的信息了,但是客户端显示发送成功,这是怎么回事??请指教
      

  7.   

    是啊,连接成功了的,但把断点放在这个函数里:
    void CClientSocket::OnConnect(int nErrorCode) 
    {
    // TODO: Add your specialized code here and/or call the base class

    CAsyncSocket::OnConnect(nErrorCode);
    }
    就会发现,没有执行这个函数。
    其他的OnXxx函数同样没有执行到的。
      

  8.   

    nuaawenlin(飘人) :就是想问问,在Win32 Console Application里面,该怎样才能让OnXxx函数收到消息?因为现在连接关闭后,程序不知道,我想用OnClose来处理
      

  9.   

    没有窗口
    消息不知道推动到那
    ------------------------正确,你可以建立一个窗口但是不显示啊,把这些消息和该窗口联系起来。使用CAsyncSocket是需要这么一个步骤的。
    CSocket已经预先建立了窗口了
    我现在已经不在使用微软封装的几个xSocket类了,他们对于跨线程和在动态库中使用,经验丰富的人一定会大伤脑筋的哦,建议直接使用socket API吧,用来也并不复杂
      

  10.   

    文档上说只调用返回出错且错误为WSAEWOULDBLOCK时且应用程序使用才能收到可覆盖的回调时才能收OnConnect消息。查MSDN
      

  11.   

    控制台应用程序中receive()是要有函数调用的,至于如何调用,那就要根据你编程时程序执行顺序来实现,所以要保证服务器端和客户端receive()和send()的一致性
      

  12.   

    客户端接字的创建是时不能要端口号,否则不能触发ONRECEIVE