从CAsyncSocket的派生类:
class CPeekDataSocket : public CAsyncSocket
{
   .
   .
   .
};线程函数:
DWORD WINAPI PeekDataFunc(LPVOID lpParam)
{
    CPeekDataSocket PeekDataSocket;
    PeekDataSocket.Create();
    PeekDataSocket.Connect(IPAddress,Port);//这里就出现 WSAEWOULDBLOCK 10035 错误
    while (::GetMessage(&msg,0,0,0))
{
            .
            .
            .
          }
}是不是线程里没办法使用CAsyncSocket的派生类啊
救命啊,这条路只有继续走下去,不能回头重新设计程序结构了,高手帮忙

解决方案 »

  1.   

    WSAWOULDBLOCK肯定不是没有初始化的问题……
      

  2.   

    flyelf(空谷清音) ( ) 信誉:145 
    初始化socket的环境了?
    ================================
    已经初始化了
      

  3.   

    if (!AfxSocketInit())
    {
       AfxMessageBox("Ì×½Ó×Ö³õʼ»¯Ê§°Ü");
       return FALSE;
    }需要在每个线程中都要来吗?
      

  4.   

    AfxMessageBox("Ì×½Ó×Ö³õʼ»¯Ê§°Ü");
    ----------------------------------------------------------------------
    这条提示信息好奇怪,看不懂耶~!
      

  5.   

    krh2001(边城浪子) ( ) 信誉:98  2005-05-22 22:23:00  得分: 0  
     
     
       AfxMessageBox("Ì×½Ó×Ö³õʼ»¯Ê§°Ü");
    ----------------------------------------------------------------------
    这条提示信息好奇怪,看不懂耶~!
      
    =============================================================================
    中文的就变这个样子了
      

  6.   

    IF (非要多线程不可? )
    BEGIN 
      GOTO 10楼;
    END
    ELSE
    BEGIN
      GOTO 20楼;
    END
      

  7.   

    我不相信, CSocket 这个灰本身就是为了 避免多线程的
      

  8.   

    好像没有错误吧,非阻塞套接字CAsyncSocket就是这样的。
    WSAEWOULDBLOCK 10035  无法立即完成一个非阻挡性套接字操作。 要知道连接是否成功,调用select就知道了。
      

  9.   

    CAsyncSocket是异步操作的所以是非阻塞的模式返回WSAEWOULDBLOCK 很正常使用select判断端口是否可写,当可写的时候,就证明连上了
      

  10.   

    select后表明是可以操作的,能发数据,就是进不了CAsyncSocket的派生类的消息处理函数,好像消息循环全没用了,我想实现对方发数据过来就自动执行相应的动作,比如保存啊,或给一个自定义的回应之类的,要怎么解决啊
      

  11.   

    PeekDataSocket.Connect(IPAddress,Port);IP与PORT与服务器对应吗?
    不防把服务端贴上来
      

  12.   

    CAsyncSocket是异步操作的,所以是非阻塞的模式,Connect后就马上返回了。
    要知道是不是连接成功,要在 OnConnect中进行判断。
    不过建议你Connect后,Sleep(100)一般都可以了。
      

  13.   

    PeekDataSocket.Connect(IPAddress,Port);IP与PORT与服务器对应吗?
    不防把服务端贴上来
    ========================================
    这个不是问题,有两个版本的,有一个工作正常,一样的写法,不同之处就是正常工作的那个 作为了CDialog的派生类的一般数据成员,消息映射就是正常的,不正常的这个是在线程函数的堆栈上创建的对象,这个是唯一的一个不同点
      

  14.   

    纠正:PeekDataSocket.Connect(IPAddress,Port);IP与PORT与服务器对应吗?
    不防把服务端贴上来
    ========================================
    这个不是问题,有两个版本的,有一个工作正常,一样的写法,不同之处就是正常工作的那个CAsyncSocket的派生类作为了CDialog的派生类的一般数据成员,消息映射就是正常的,不正常的这个是在线程函数的堆栈上创建的对象,这个是唯一的一个不同点
      

  15.   

    CAsyncSocket是异步操作的,所以是非阻塞的模式,Connect后就马上返回了。
    要知道是不是连接成功,要在 OnConnect中进行判断。
    不过建议你Connect后,Sleep(100)一般都可以了。
    ================================================
    我用select判断了,就是进不了这些消息相应函数
      

  16.   

    search "MFCAsync" in msdn
      

  17.   

    CPeekDataSocket PeekDataSocket;
    定义为全局变量试试
      

  18.   

    CPeekDataSocket PeekDataSocket;
    定义为全局变量试试
    ==================================
    全局变量不行,每个线程需要独立的一个不知道线程局部存储支不支持这个
      

  19.   

    我也遇到了类似的问题,
    当我把MFC设成SHARED的时候,在线程里面加个AfxSocketInit()就可以,但是如果是STATIC的时候也还是不行的要不的话,用全局的话好像也可以解决的
      

  20.   


    CAsyncSocket的回调机制其实是使用了窗口的消息投递机制来实现。
    你的问题应该是消息投递到了主线程中创建的窗口的缘故。
    彻底抛弃CAsyncSocket,使用socket API吧!我就从来不用CAsyncSocket和CSocket,因为它会经常出现一些莫名其妙的问题。
    一次我的项目调用了CSocket::Create后,只要一打开输入法,程序就崩溃。但只要不调用Create,就没有问题,跟进MFC源码发现CAsyncSocket作了很多与窗口有关的处理,但始终没找到原因,最后我自己用socket API重写了一个CSocket类才解决了问题。
      

  21.   

    楼上, 同感! 我用的一般都是自己封装的SOCKET 类