自己写的两个函数,包含在一个文件里的      BOOL UploadParser(LPCTSTR str,LPCTSTR msg ,SOCKET& Socket)
      {                      //调用完就在这行就不往里走了,参数都接到了
          ……
       }if(m_str=="UploadLog")
{
     UploadParser(m_str,m_temp,sClient);  //就这里调用的,结果UploadParser的参数可以接收到传上来内容,但是却进不了函数体
}WHY????

解决方案 »

  1.   

    UploadParser(m_str,m_temp,sClient);
    m_str,m_temp,sClient这三个参数中sClient是连接socket的吗,那么你的socket设置是否有问题呢??
      

  2.   

    呵呵,我只碰到一次类似问题,那是我给别人调程序的时候,
    他装了visual assist,本来代码不是执行到这行的,
    visual assist给弄乱了,显示成了这行。
      

  3.   

    捕获一下异常,看看socket传递过来的时候是否有异常发生!
      

  4.   

    ② BOOL UploadParser(LPCTSTR str,LPCTSTR msg ,SOCKET& Socket)
        ③  {                      //调用完就在这行就不往里走了,参数都接到了
              ……              //这里看都不看一眼
           }
    try
    {
       if(m_str=="UploadLog")
       {
         ①    UploadParser(m_str,m_temp,sClient); 
       }
    }
    catch(...)
    {
       ④  ……
    }上面是执行的顺序
      

  5.   


          BOOL UploadParser(LPCTSTR str,LPCTSTR msg ,SOCKET& Socket)
          函数改一下:
    BOOL UploadParser(LPCTSTR str,LPCTSTR msg ,SOCKET* pSocket)
    试一下呢?
      

  6.   


          BOOL UploadParser(LPCTSTR str,LPCTSTR msg ,SOCKET& Socket)
          函数改一下:
    BOOL UploadParser(LPCTSTR str,LPCTSTR msg ,SOCKET* pSocket)
    试一下呢?
      

  7.   

    csdn 的表好快哦,我的计算机上的才17:14 ,它就17:24了
      

  8.   

    LPCTSTR str,LPCTSTR msg 的缓冲长度是否足够,是否越界。
      

  9.   

    长度肯定是够的,我怀疑也是SOCKET的毛病,先改了再看
      

  10.   

    Rebuild All
    如果是在动态链接库中,Rebuild All DLL,再同步左右的库&Rebuild All
      

  11.   

    先用这个接收UINT CVSDlg::OnAcceptThread(LPVOID lParam)
    {
    SOCKET conn=(SOCKET)lParam;
    while(1)
    {
    if(::WaitForSingleObject(g_eventKill,0)==WAIT_OBJECT_0)
    return 0L;
    SOCKET Client;
    sockaddr_in sockaddr;
    int len=sizeof(sockaddr);

    Client=accept(conn,(SOCKADDR*)&sockaddr,&len);
    if(Client!=INVALID_SOCKET)
    {
    AfxBeginThread(OnRecvThread,(LPVOID)Client,THREAD_PRIORITY_NORMAL,0,0,NULL);
    }
    }
    return 0L;
    }接到了就起这个UINT CVSDlg::OnRecvThread(LPVOID lParam)
    {

    SOCKET Client=(SOCKET)lParam;
    while(1)
    {
    char buf[MAX_BUFFER];
    memset(buf,0,MAX_BUFFER);
    if(recv(Client,buf,MAX_BUFFER,0)!=SOCKET_ERROR)
    {

    CString m_temp;
    m_temp.Format("%s",buf);
    m_temp.Trim();
    Sub(Client,m_temp);
    }
    else
    {
    return 0L;
    }
    }
    return 0L;
    }
    然后再起 SUB
    void Sub(SOCKET sClient,LPCTSTR m_temp)
    {
         ……try
    {
       if(m_str=="UploadLog")
       {
             UploadParser(m_str,m_temp,sClient); 
       }
    }
    catch(...)
    {
         ……
    }}调用 BOOL UploadParser(LPCTSTR str,LPCTSTR msg ,SOCKET& Socket)
          {                      //调用完就在这行就不往里走了,参数都接到了
              ……              //这里看都不看一眼
           }结果就出现了刚才的一幕
      

  12.   

    Rebuild ALL的朋友,先谢谢了,我已经ALL不知道多少遍了,呵呵
      

  13.   

    faint,没看到,原来跑Catch里了,看来Socket对象可能出错了,有别的线程访问该Socket吗?
      

  14.   

    試試
    BOOL UploadParser(LPCTSTR str,LPCTSTR msg ,const SOCKET& Socket)
      

  15.   

    先用这个接收UINT CVSDlg::OnAcceptThread(LPVOID lParam)
    {
    SOCKET conn=(SOCKET)lParam;
             SOCKET Client;
    sockaddr_in sockaddr;
    int len=sizeof(sockaddr); while(1)
    {
    if(::WaitForSingleObject(g_eventKill,0)==WAIT_OBJECT_0)
    return 0L;

    Client=accept(conn,(SOCKADDR*)&sockaddr,&len);
    if(Client!=INVALID_SOCKET)
    {
    AfxBeginThread(OnRecvThread,(LPVOID)Client,THREAD_PRIORITY_NORMAL,0,0,NULL);
    }
    }
    return 0L;
    }接到了就起这个UINT CVSDlg::OnRecvThread(LPVOID lParam)
    {

    SOCKET Client=(SOCKET)lParam;
    while(1)
    {
    char buf[MAX_BUFFER];
    memset(buf,0,MAX_BUFFER);
    if(recv(Client,buf,MAX_BUFFER,0)!=SOCKET_ERROR)
    {

    CString m_temp;
    m_temp.Format("%s",buf);
    m_temp.Trim();
    Sub(Client,m_temp);
    }
    else
    {
    return 0L;
    }
    }
    return 0L;
    }
    然后再起 SUB
    void Sub(SOCKET sClient,LPCTSTR m_temp)
    {
         ……try
    {
       if(m_str=="UploadLog")
       {
             UploadParser(m_str,m_temp,sClient); 
       }
    }
    catch(...)
    {
         ……
    }}调用 BOOL UploadParser(LPCTSTR str,LPCTSTR msg ,SOCKET& Socket)
          {                      //调用完就在这行就不往里走了,参数都接到了
              ……              //这里看都不看一眼
           }结果就出现了刚才的一幕
      

  16.   

    BOOL UploadParser(LPCTSTR str,LPCTSTR msg ,SOCKET Socket)
      

  17.   

    同意楼上的SOCKET不应该以引用的方式传递,但应该不会引起这样的问题
      

  18.   

    今我又换了个方法,把UploadParser函数体内的内容注释掉,然后加入一行AfxMessageBox结果居然可以执行到这句???这说明可以进入函数体拉,我马上把注释掉的内容给恢复回来,TMD,结果连AfxMessageBox()都不执行拉,真是郁闷
      

  19.   

    (m_str=="UploadLog") 可以在C++中這樣進行字符串比較嘛?應該用STRCMP這個函數吧!
      

  20.   

    对传过来的数据进行处理的只要函数体内只有这个AfxMessageBox就可以进去,否则即使仍然把AfxMessageBox放在函数体内的第一行,但只要把其他的内容都恢复回来他连这第一巨都不执行
      

  21.   

    能否把 BOOL UploadParser(LPCTSTR str,LPCTSTR msg ,SOCKET& Socket)的函数体贴出来看看
      

  22.   

    哈哈,哈哈,搞定了,终于找到原因拉原来是我的缓冲区定义有问题,我定义的是
    #define MAX_BUFFER 65535 
    然后使用的时候
    char buf[MAX_BUFFER]    //结果就错了哈我改成#define MAX_BUFFER 32768U  之后就好拉巧合就巧合在我别的函数都没有使用到这个缓冲区,就那个函数用了,所以我也误导大家了,一直都以为是传参数的问题,那就中传法都是正确的,直接传,或传引用,或传指针,所以都不是传参的问题。谢谢大家对我的帮助,这就揭贴了
      

  23.   

    void Sub(SOCKET sClient,LPCTSTR m_temp)
    {
         ……try
    {
       if(m_str=="UploadLog")
       {
             UploadParser(m_str,m_temp,sClient); 
       }
    }
    catch(...)
    {
         ……
    }}调用 BOOL UploadParser(LPCTSTR str,LPCTSTR msg ,SOCKET& Socket)
          {                      //调用完就在这行就不往里走了,参数都接到了
              ……              //这里看都不看一眼
           }结果就出现了刚才的一幕>>要注意哦,你是在try里调用的BOOL UploadParser(LPCTSTR str,LPCTSTR msg ,SOCKET& Socket)
    如果你在{
               ... ...
              }
    之中出了错,特别是rum-time的错误,当然就不会执行这里的代码了,就会转到catch之中去执行错误处理程序了。在这里LPCTSTR str,LPCTSTR msg是CString类,一般不会出错,出错的地方很可能是与SOCKET&Socket包含错误的信息有关。
    由于没有读到{
                  ... ...
                  }的内容,所以我无法确定我的猜想是不是正确。由于我在外面打工,只是今天才有时间回校,请楼主自行判断,或者其他高手帮忙指教。sorry,我对多线程的编程也不是很熟。