本帖最后由 oyljerry 于 2014-12-09 16:54:21 编辑

解决方案 »

  1.   

    //监听客户端请求线程
    UINT __cdecl _ThreadFile(LPVOID pPM)
    {
    g_sockSever = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);           //创建服务套接字(TCP) SOCKADDR_IN ServerAddr;                                       //分配端口及协议族并绑定 ServerAddr.sin_family=AF_INET;                                
    ServerAddr.sin_addr.S_un.S_addr  =htonl(INADDR_ANY);          
    ServerAddr.sin_port=htons(PORT); int nRet=bind(g_sockSever,(LPSOCKADDR)&ServerAddr,sizeof(ServerAddr)); // 绑定套接字
    if(nRet==SOCKET_ERROR)
    {
    ServerAddr.sin_port=htons(PORT+1);
    TRACE( _T("端口冲突,换一个.\n"));
    bind(g_sockSever,(LPSOCKADDR)&ServerAddr,sizeof(ServerAddr)); // 再次绑定套接字
    } nRet=listen(g_sockSever,64);                               //开始监听,并设置监听客户端数量
    if(nRet==SOCKET_ERROR)     
    {
    AfxMessageBox(L"监听出错!");
    return FALSE;
    }                            AfxMessageBox(L"服务器启动成功,开始监听了"); SOCKADDR_IN ClientAddr;                // 定义一个客户端得地址结构作为参数
    int addr_length=sizeof(ClientAddr); while(TRUE)
    {
    SOCKET m_sockComm = accept(g_sockSever,(SOCKADDR *)&ClientAddr, &addr_length);
    if( m_sockComm==SOCKET_ERROR )
    {
    break;
    } CString pSendMsg=L"这是一条来自服务器的消息";
    nRet=send(m_sockComm, 
          (LPSTR)(LPCTSTR)pSendMsg, 
      pSendMsg.GetLength()*2, 0); if(nRet == SOCKET_ERROR)
    {
    TRACE(L"%d", WSAGetLastError());
    }
    //char pRevMsg[50001]={0};
    //nRet = recv(m_sockComm, pRevMsg, 50000, 0);

    //FILE *fpWrite = NULL;
    //fpWrite = fopen("1.jpg","wb"); //fwrite(pRevMsg,nRet,1,fpWrite);
    //fclose(fpWrite); }
    return 0;
    }
      

  2.   

    建议你使用
    CxUdpSocket
    http://www.cnblogs.com/EdmundDwyane/p/3218838.html
    CxClientSocket
    http://www.cnblogs.com/EdmundDwyane/p/3248297.html
    CxServerSocket
    http://www.cnblogs.com/EdmundDwyane/p/3278641.html
      

  3.   

    1.accept本来就是阻塞的,你理应放入线程中去accept
    2.你放入线程出错退出,具体代码没贴,不太清楚情况,你要把错误贴上来,建议是不要在线程使用CSocket
    3.1L代码可用,你试试看
    4.客户端断开重连也没有数据,你检查检查你的客户端socket是否有问题,拿WSAGetLastError获取错误码去看描述,错误码查看工具是ErrorLookup
      

  4.   


    DWORD  dwThreadId;  
    HANDLE  hThread;  //全局变量
    DWORD WINAPI AnswerThread(LPVOID lp) //线程函数
    {
    CXMLTestDlg *p = (CXMLTestDlg*)lp;
    while(1)
    {
    p->listenSocket->Accept(* (p->mySocket));
    }
    return 0;
    }//连接按钮中启动线程
    listenSocket->Create(m_iPort);
    listenSocket->Listen(1);
    hThread =CreateThread(NULL,NULL,AnswerThread,this,0,&dwThreadId);
      

  5.   


    DWORD  dwThreadId;  
    HANDLE  hThread;  //全局变量
    DWORD WINAPI AnswerThread(LPVOID lp) //线程函数
    {
    CXMLTestDlg *p = (CXMLTestDlg*)lp;
    while(1)
    {
    p->listenSocket->Accept(* (p->mySocket));
    }
    return 0;
    }//连接按钮中启动线程
    listenSocket->Create(m_iPort);
    listenSocket->Listen(1);
    hThread =CreateThread(NULL,NULL,AnswerThread,this,0,&dwThreadId);
    建议楼主不要在线程中使用CSocket,之前我在线程中使用CSokect时,会出现很多莫名其妙的问题,CSockey如果当真要使用,必须把创建监听等函数的调用全部放在一个线程里,跨线程有问题,这里也提到了
    http://blog.csdn.net/hgy413/article/details/6202979