none
一天时间没找出错误的程序,大家看看 RRS feed

  • 问题

  • 在写一http服务器的程序,为了不用while循环,结合网上的例子,尝试用下面的函数实现循环监听的功能:

    DWORD CIOCP::ListenProc(LPVOID lpParam)//线程函数
    {
     CIOCP *pthis = reinterpret_cast<CIOCP*>(lpParam);
     DWORD dwbyte = 0;

    // ASSERT(pClient->IsKindOf(RUNTIME_CLASS(CClient)));

     CClient *client = new CClient;

     if(NULL == client)
     {
      AfxMessageBox(_T("11"));
      return false;
     }

    client->m_ListenSocket = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
     if(INVALID_SOCKET == client->m_ListenSocket)
     {
      AfxMessageBox(_T("6"));
      return false;
     }

     ......................

      if(SOCKET_ERROR == WSAIoctl(client->m_ListenSocket, SIO_GET_EXTENSION_FUNCTION_POINTER, &guid, sizeof(guid), &pthis->lpAcceptEx, sizeof(pthis->lpAcceptEx), &dwbyte, NULL, NULL))
     {
      
      AfxMessageBox(_T("10"));
      return false;
     }

     if(pthis->CirListen(client) == false)//调用下面的函数,传递的是函数的指针
     {
      AfxMessageBox(_T("12"));
      return false;
     }

     return true;
    }

    BOOL CIOCP::CirListen(CClient *lpClient)
    {
     ASSERT(lpClient->IsKindOf(RUNTIME_CLASS(CClient)));

     if(lpClient->m_ListenSocket == INVALID_SOCKET)
     {
      AfxMessageBox(_T("16"));
     }

     lpClient->m_AcceptSocket = WSASocket(AF_INET,
               SOCK_STREAM,
               IPPROTO_TCP,
               NULL,
               0,
               WSA_FLAG_OVERLAPPED);
     if(INVALID_SOCKET == lpClient->m_AcceptSocket)
     {
      AfxMessageBox(_T("13"));
      return false;
     }

     DWORD dwbyte = 0;
     if(false == lpAcceptEx(lpClient->m_ListenSocket,
                lpClient->m_AcceptSocket,
                lpClient->m_buf.buf,
                lpClient->m_buf.len-((sizeof(SOCKADDR_IN)+16)*2),
                  sizeof(SOCKADDR_IN)+16,
                sizeof(SOCKADDR_IN)+16,
                &dwbyte,
                &(lpClient->m_ol)))//在CClient类的构造函数中:memset(&m_ol, 0, sizeof(m_ol));
     {
      int i = GetLastError();//10014,系统检测到在一个调用中尝试使用指针参数时的无效指针地址。
      AfxMessageBox(_T("14"));
      return false;
     }

     return true;
    }

    调试总是提示10014, 找了一天, 木有找出错误, 大家给看看


    xiao
    2011年3月13日 5:51

答案

  • MSDN上对错误10024的解释是:

    WSAEFAULT (10014)

    • 翻译: 不正确的地址。
    • 说明: 尝试使用指针参数的调用时,系统检测到无效的指针地址。如果某个程序通过一个无效的指针值,或如果缓冲区的长度太小,会发生此错误。例如对于如果小于 sizeof(SOCKADDR) 值的参数是一个 SOCKADDR 结构的长度,则将发生此问题。

    这个程序中的

     lpClient->m_buf.buf,
    lpClient->m_buf.len-((sizeof(SOCKADDR_IN)+16)*2),

    这里要定义一个字符数组char  buf[1024];在CClient的构造函数中:m_buf.buf = buf;m_buf.len= 1024;这样就可以了.

    缓冲区的大小不合理,所以这出现了问题,错误找到了,几天时间没白费.

     


    xiao
    • 已标记为答案 wh_xiao 2011年3月15日 7:23
    2011年3月15日 7:22

全部回复

  • 好象是这句有问题,不确定

    if(pthis->CirListen(client) == false)

    ............

    BOOL CIOCP::CirListen(CClient *lpClient)
    这里的参数是类的指针,不知道传递的方式对不对


    xiao
    2011年3月13日 21:56
  • 应该是您传递给lpAcceptEx函数的参数无效了吧,您需要好好的检查一下参数是否有效?
    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年3月14日 1:33
    版主
  • MSDN上对错误10024的解释是:

    WSAEFAULT (10014)

    • 翻译: 不正确的地址。
    • 说明: 尝试使用指针参数的调用时,系统检测到无效的指针地址。如果某个程序通过一个无效的指针值,或如果缓冲区的长度太小,会发生此错误。例如对于如果小于 sizeof(SOCKADDR) 值的参数是一个 SOCKADDR 结构的长度,则将发生此问题。

    这个程序中的

     lpClient->m_buf.buf,
    lpClient->m_buf.len-((sizeof(SOCKADDR_IN)+16)*2),

    这里要定义一个字符数组char  buf[1024];在CClient的构造函数中:m_buf.buf = buf;m_buf.len= 1024;这样就可以了.

    缓冲区的大小不合理,所以这出现了问题,错误找到了,几天时间没白费.

     


    xiao
    • 已标记为答案 wh_xiao 2011年3月15日 7:23
    2011年3月15日 7:22