问题如上,代码简化如下:
void ser_thread(void * iparam)
{
AfxSocketInit();
//class cser:public csocket
cser *a;
a->create(7777,"127.0.0.1");
a->listen(5);
......
}
void cli_thread(void * iparam)
{
AfxSocketInit();
//class ccli:public csocket
ccli *b;
b->create();
b->connect("127.0.0.1",7777);
....
}//OnAccept未被调用
void cser::OnAccept(int c)
{
AfxMessageBox("OnAccept",MB_OK,0);
CSocket::OnAccept(c);
}//将ser_thread改为
void ser_thread(void * iparam)
{
AfxSocketInit();
//class cser:public csocket
cser *a;
a->create(7777,"127.0.0.1");
a->listen(5);
CSocket d;
if(a->accept(d))
{
AfxMessageBox("Accept",MB_OK,0);//可以被调用
}
}
//如将下面代码放入主线程的OnInitDialog中就可以正常调用OnAccept,请问这是为身摸,如何才能在线程中正常使用
AfxSocketInit();
//class cser:public csocket
cser *a;
a->create(7777,"127.0.0.1");
a->listen(5);

解决方案 »

  1.   

    CSocket已经修改了CAsyncSocket的行为,不再通过事件来处理。如果你从CSocket派生,就应该循环Accept,而不是等FD_ACCEPT,
      

  2.   

    如果要事件,一定要从CAsyncSocket派生
      

  3.   

    CSocket只是将阻塞提前出OnAccept等方法了(书上写的)
    并且我将CSocket放在主线程中也是可以正确触发OnAccept的呀?如用CAsyncSocket的化就没必要放入子线程了,因为它本身就是非阻塞的呀。
      

  4.   

    啊,问题又来了,即使改成是CAsyncSocket的派生类也一样是无法响应事件
      

  5.   

    你创建listen socket的那个线程有没有处理消息循环?就是Msg msg;
    while(::GetMsg(&msg,NULL,....) 之类的代码?如果你不是用户界面线程,这需要你自己做的你关于CSocket+OnAccept后面的话是对的,但是你怎么保证他没处于阻塞状态呢?为什么要跨越模型使用一种不合理的方法呢?
      

  6.   

    线程已经用AfxSocketInit();初试化了呀,此函数不是内部建立一窗口并建立消息循环吗?
    我是初接触CSocket和CAsyncSocket,比较菜,呵呵
      

  7.   

    http://blog.csdn.net/wang921718/archive/2007/09/04/1772396.aspx看看这里我的BLOG,希望对你能有帮助!
      

  8.   

    恩,看了wang921718的blog,其中的WSAGETSELECTEVENT(lParam)是身摸意思?是LOWORD(lParam)吗?没这样用过。
    您的程序看上去是单线程的,这个我用SOCKET或CAsyncSocket也都可以模拟,但我现在是将CAsyncSocket或CSocket的派生类放到子线程中创建后无法触发事件(FD_XXX),但不用事件直接用while(1){accept(client)}模式是可以的,我的疑问就是如何才能出发FD_XXX事件
      

  9.   

    消息循环是线程的属性,和socket无关。你自己不建立消息循环,就不可能处理任何消息
    去找找“用户UI线程”相关知识,这个需要几个月才能弄明白的,多线程设计是个很复杂的话题
      

  10.   

    我觉得arong1234说得非常有道理!
    我也遇到了这个问题,一直没想明白,因为我是把一个Worker Thread给重新封装了一下,没有想到消息循环。
    明天去试试是不是这么回事。