我把代码简单描述一下        memset(&rm_hints, 0, sizeof(rm_hints));
rm_hints.ai_family = AF_UNSPEC;
// rm_hints.ai_family = AF_INET6;
rm_hints.ai_socktype = SOCK_DGRAM;
rm_hints.ai_protocol = IPPROTO_UDP;
rm_hints.ai_flags = AI_CANONNAME; // 解析远程IP地址
retVal = getaddrinfo(addr, TEXT_PORT, &rm_hints, &RemoteInfoText);调试时候,总是有个Unhandled Exception : 0xC0000005 Aceess Violation.其中我的 rm_hints 和 RemoteInfoText 是如下定义的。struct addrinfo rm_hints;
struct addrinfo *RemoteInfoText = NULL, *RemoteInfoAudio = NULL;
在创建本地监听线程的时候,也用到了getaddrinfo(),没有错误,在解析远程地址时候,就出这个错误。头麻木了。。
求高手帮我讲解一下

解决方案 »

  1.   

    //    解析远程IP地址
        retVal = getaddrinfo(addr, TEXT_PORT, &rm_hints, &RemoteInfoText);
    -------------------
    是不是你解析远程地址的时候getaddrinfo函数失败了,导致后面的出错了呢?
      

  2.   


    在getaddrinfo()下面紧跟着 int err = GetLatError();
    调试根本下不去,得不到Error信息。
      

  3.   

    你设置成NULL,干嘛struct addrinfo *RemoteInfoText = NULL, *RemoteInfoAudio = NULL;
    直接定义好了
    struct addrinfo *RemoteInfoText, *RemoteInfoAudio;
      

  4.   


    效果是一样的额,我开始以为也是指针设置成NULL的问题,该了还是一样的。
      

  5.   


    在独立的线程里面,recvfrom收不到包是怎么回事?
    返回的错误代码是 10014线程里面的主要代码如下while(TURE)
    {
    Sleep(100);
    DataLen = recvfrom(ListenText, m_prBuffer, 1024, 0, recvAddr->ai_addr, &len);
    int err = GetLastError();
    if (DataLen > 0)
    {
                  ......
            }

      

  6.   


    嗯,检测出来了,是我定义了一个对象指针,没有new它。。线程中recvfrom 函数,怎么接受IPv6的地址呢?sockaddr *貌似不行,IPv6的地址128位,需要16个字节来存。
      

  7.   

    sockaddr_in6 a ;(sockaddr *)&a,sizeof(sockaddr_in6)
    其实说白了你给TA一个较大的就成,管TA里面存的什么呢。基本上所有这些要求传入长度的都是用来限定可用长度的,输出的时候不一定都用满。
      

  8.   


    我测试本机的,本机的服务socket
    根据getaddrinfo(NULL, TEXT_PORT, &hints, &LocalInfoText); 返货的LocalInfoText创建的,bind()之后,
    我输入“::1”,自己给自己发送数据,
    DataLen = recvfrom(ListenText, m_prBuffer, 1024, 0, (sockaddr *)recvAddr, &AddrLen);
    int err = GetLastError();
    (其中recvAddr是sockaddr_in6 类型,AddrLen是sizeof(sockaddr_in6))
    收不到数据。。DataLen的值总是 -1
    err是值是10014悲剧。。
      

  9.   


    其中recvAddr是sockaddr_in6 *类型,上面打错了。用的是 sockaddr_in6 *recvAddr = new sockaddr_in6;
      

  10.   


    我知道是AF_INET6。。但是返回值总是10014真不知道怎么解决了,网上没有相关的。。
      

  11.   

    sockaddr_in6 *recvAddr = new sockaddr_in6;
    int DataLen;
    CString strText, strTime;
    int AddrLen = sizeof(sockaddr_in6);
    char m_prBuffer[1024];
    CTime tm;while(TRUE)
    {
    Sleep(100);
    // DataLen = recvfrom(ListenText, m_prBuffer, 1024, 0, (sockaddr *)recvAddr, &AddrLen);
            ...
    }这样写,求告诉我错误在哪
      

  12.   


    sockaddr_in6 看看你的头文件里定义的结构体大小是否为28,如果不是的话,那么就改成下面的方法吧。sockaddr_in6 *recvAddr = (sockaddr_in6 *)new char[32];
    int AddrLen = 32;
    while(TRUE)
    {    Sleep(100);
    //    DataLen = recvfrom(ListenText, m_prBuffer, 1024, 0, (sockaddr *)recvAddr, &AddrLen);
            ...
    }其它解决方法:把平台版本升高(在工程的所有include之前写。)
    #ifndef WINVER                       
    #define WINVER 0x0501           
    #endif#ifndef _WIN32_WINNT            
    #define _WIN32_WINNT 0x0501     
    #endif旧版本的 sockaddr_in6 只有24字节,实际需要的是28字节。