我现在封装CAsyncSocket在一个动态库中,没有窗口,发现OnConnect等相关无法相应,应该有人遇到过如此问题,如何解决呢???不会要在动态库中创建个窗口吧?我把相关的代码移到对话框中就可以了,可是我必须在动态库中实现客户端,已经写了很多了,不想再改为api来写了,呜呜但我同事把CAsyncSocket封装在DLL中做了个服务器端,一点问题没有,事件也可以响应,我这边查了半天也不行?

解决方案 »

  1.   

    CAsyncSocket的实现靠的是WSAAsyncSelect,而这个API会将socket和一个窗口绑定。socket的所有事件通知都是让这个窗口发送消息来实现,所以在创建socket的线程中必须有消息循环。你使用CSocket/CAsyncSocket的话,最好遵循以下两个规则:1、在创建CSocket/CAsyncSocket的线程,保证AfxSocketInit最先被调用过。2、在创建CSocket/CAsyncSocket的线程中,会有一个消息循环,有没有窗口无所谓,这样OnSend/OnReceive/OnAccept这些事件才会发生。
      

  2.   

    你使用CSocket/CAsyncSocket的话,最好遵循以下两个规则:1、在创建CSocket/CAsyncSocket的线程,保证AfxSocketInit最先被调用过。2、在创建CSocket/CAsyncSocket的线程中,一定要有一个消息循环,有没有窗口无所谓,这样OnSend/OnReceive/OnAccept这些事件才会发生。
      

  3.   

    我同事的程序是DLL中封装CAsyncSocket,外部由一个对话框调用这个动态库,,那些事件是可以发发生的? 我现在搞不懂,为什么他的可以我的程序也是个单文档,调DLL,如果需要消息循环,如何做呢??
    是否是创建个对话框,然后让CAsyncSocket对象为 对话框的成员,就可以了呢
      

  4.   

    AfxSocketInit这个我早已经调过了我在DLL中创建了个无模对话框,CAsyncSocket对象为对话框的成员,然后调CAsyncSocket对象创建,连接等,仍然没有事件,按说,对话框里有消息循环啊
      

  5.   

    1、socket的创建是在哪个线程中
    2、你的窗口听创建是在哪个线程中无模对话框创建之后,你写没有写while (GetMessage (...))
    {
      TranslateMessage (..);
      DispatchMessage (...);
    }
    类似的消息循环?估计你没有写
      

  6.   

    class CGPRS : public CComPort  
    {
    public:
    CGPRS();
    virtual ~CGPRS(); int OpenPort(DEVCONFIG* pDevConfig);
    int WritePort(char* buf, int size);
    int ReadPort(char* buf, int size, int timeout = 0);
    int ClosePort();// Attributes
    public:
    CClientSocket m_Socket;
    };我目的是创建这样一个类,CComPort是个纯虚基类,外部程序只需要调用接口,就可以发送数据了
    所以,我也没起什么线程啊,比分说,ReadPort 如果有事件响应,那就在OnReceive中接收到数据填充buf就可以了我原先以为无模对话框,自然会有消息派发这些,是没写
    while (GetMessage (...))
    {
      TranslateMessage (..);
      DispatchMessage (...);
    }
    原先用CAsyncSocket就是想简单些的,如果要写
    while (GetMessage (...))
    {
      TranslateMessage (..);
      DispatchMessage (...);
    }
    具体该在哪写呢? 谢谢
      

  7.   

    可能我说多了,呵呵,就问下,如何在DLL中可以让事件相应, 
    to xstring(麻雀) ,我没有起线程,就一个CAsyncSocket对象
      

  8.   

    那要问你的同事,接收消息的是自己创建的窗口还是,借助Owner窗体了,如果是借助Owner窗体的话,你要自己写消息循环。写在窗口回调函数里,具体,你要学学Platform SDK了,这可以VC的基本功啊
      

  9.   

    什么线程啊!肯定没有初始化SOCKET,自己看看!
      

  10.   

    啊,晕, SOCKET我肯定初始化了,
    if (!AfxSocketInit())
    {
    AfxMessageBox("Windows sockets initialization failed.");
    return FALSE;
    }有谁可以给个简单例子吗,DLL中使用CAsyncSocket,不胜感激
    [email protected]解决了立马接贴,谢了
      

  11.   

    我有点混了,有谁可以说说关于CAsyncSocket这里面的消息是怎么回事吗,我看了MFC源码,里面创建时,已经产生了个CSocketWnd,不知道这些是???还需要什么消息循环啊