UINT ProcessSendData(LPVOID lparam)
{
    CSocket socket;   
    socket.Create();  /////堆栈错误?? 在堆栈中创建也出错。
}
app类已经调用了初始化函数。
直接用API也没有问题, 但send数据后服务器端接收不到,但调试发现send发送字节数正确没有错误。另一个对话框应用程序也没错。
我这个线程在一个非模式对话框中创建,不知道为什么会出错。在对话框中创建socket后detach再传给线程attach也一样错误。实在不知道咋回事了。难道在非模式对话框中启动线程不能使用csocket?

解决方案 »

  1.   

    每个线程要调用一次AfxSocketInit吧,呵呵
      

  2.   

    啊?不会没调用吧?
    你建工程的时候是不是选择了Socket支持?你看InitInstance的第一句话是什么? :)
      

  3.   

    我已经说了在App类已经调用了,但是线程里面并没有调用,我在对话框应用程序中不需要调用也没有错误。
      

  4.   

    你是说你的对话框程序没有调用AfxSocketInit()也没问题? 那就不知道了,呵呵...诡异~
      

  5.   

    晕,说的是对话框程序只在App类的Instance中调用了,对话框启动的线程中并未调用。你现在是要我在线程中也调用啊。
      

  6.   

    一个线程要调用一次的...既然对话框是属于你的主线程的,那么在对话框初始化的时候肯定不需要AfxSocketInit()了啊~ 呵呵~ :)
      

  7.   

    这是因为TLS的关系。在多线程下,建议用Socket API.
      

  8.   

    线程里面必须调用AfxSocketInit-------------------------------------------------------
    广告:VC/WinAPI 网络/多线程讨论 QQ群, 群号:41356711
      

  9.   

    线程里面已经调用了初始化方法,可是create还是错误。
    新建了一个对话框程序,启动一个线程就没有问题,无语了。TLS倒是有可能了,但是为什么会这样能否详细赐教,谢谢。
      

  10.   

    Csocket 是不可以跨线程的。如果非要跨线程需要特殊处理(在你启动线程的时候)。
    根本还是把CSoket转换为 Socket API。
      

  11.   

    CSocket不能跨线程,各位写个最简单的对话框程序,在里面启动一个线程,再去初始化CSocket
    看看能不能成功?  反正我已经反复实验是可以的。
      

  12.   

    CSocket 需要一个窗口来发送消息,
    因为它是消息驱动的
    如果没有了窗口,当然会失败
    除非必要,否则不要使用CSocket,
    它的实现比较垃圾的,直接用SOCKET API编写好了CSocket 可以支持多线程,前提是必须是界面线程,工作线程模式下,
    CSocket由于无法发送消息,会导致错误
      

  13.   

    socket程序还是用api吧,CSocket在多线程下不好用
      

  14.   

    线程开始调用AfxSocketInit()是必须的
      

  15.   

    实在没办法情况下改成api模式了,可是问题又来了,recv方法不阻塞,我已经octlselect设置成阻塞模式了,另外在线程中使用socket api以后如果线程send方法返回SOCKET_ERROR会将我整个应用程序关闭,实在对这些原理不太明白了,我觉得顶多是线程结束,怎么会整个应用结束呢?
      

  16.   

    CSocket类在多线程下使用有问题,这个很早就在微软的官网上有讨论的.
      

  17.   

    UINT SocketTComit(LPVOID lpParam)
    {
    //得到socket版本信息。
    WORD wVersionRequested;// 定义版本信息变量
    WSADATA wsaData;//定义数据信息变量
    int err;//定义错误号变量
    wVersionRequested = MAKEWORD(1,1);//给版本信息赋值
    err = WSAStartup(wVersionRequested, &wsaData);//给错误信息赋值
    if(err!=0)
    {
    ::AfxMessageBox("Socket fail");
    return 0;//告诉用户找不到合适的版本
    }
    else
    {
        if(LOBYTE(wsaData.wVersion)!= 1|| HIBYTE(wsaData.wVersion)!=1)
    { ::AfxMessageBox("Socket fail");
    WSACleanup();//告诉用户找不到合适的版本
    return 0;
    }
    else
    {  //#define PORT 34000  /// Select any free port you wish
     AfxSocketInit(NULL);
     CSocket sockSrvr; 
     sockSrvr.Create(PORT); // Creates our server socket
     sockSrvr.Listen(5); // Start listening for the client at PORT
     
     while (1)
     {
    CSocket sockRecv;
    int m= sockSrvr.Accept(sockRecv); // Use another CSocket to accept the connection
        if((m>0) && SendMark)
    {
    sockRecv.Send(sendstr,48);
    SendMark=!SendMark;
    }
     }
    }
    }

    return 0;
    }在多线程测试通过