char sBuf[128];
sockaddr_in6 sa;
in6_addr sa;
int iAddrLen=sizeof( sa );//这样只有24位长,不够长度。所以要改为32,实际收到是28:(
int a=sizeof(sockaddr); ZeroMemory( &sa, sizeof( sa ) );
memset(&sBuf,0,sizeof(sBuf)); //int iLen = recvfrom(s_send, sBuf, sizeof(sBuf),(struct sockaddr*)&sa, &iAddrLen );//recvfrom在winXP下也不正常而recv就可以,但recv如何获知报文源地址呢? int iLen = recv(s_send, sBuf, sizeof(sBuf),0);

解决方案 »

  1.   

    看这个MFC函数是怎么实现的,找找源代码:
    CAsyncSocket::SendToEx 
    Call this member function to send data to a specific destination (handles IPv6 addresses).http://msdn2.microsoft.com/en-us/library/5st06kh6(VS.80).aspx
      

  2.   


    我们原来代码不是用的CAsynSocket这个类实现的,而是用Windows API来实现的,现在要支持IPV6,在vckbase上下了个IPV6 UDP报文发送的例子,如上 recvfrom(s_send, sBuf, sizeof(sBuf),(struct sockaddr*)&sa, &iAddrLen );总是失败,而只好改用recv(s_send, sBuf, sizeof(sBuf),0);
    可是我还是想知道如何才能得知报文源地址.而用SendToEx也用过,每次也是不成功的,error C2039: 'SendToEx' : is not a member of 'CAsyncSocket'.
      

  3.   

    SOCKADDRIN 
    有一個 sin_family 寫成 AF_INET6, 然後 IP 地址的域有些不同。
    在 IPV4 下有幾個 zero ,IPV6 要占用幾個。
      

  4.   

    TO Fox1999:
      还是不太直观,能告诉我如何修改吗?谢谢:
      DWORD CALLBACK RecvProc(void *pWnd)
    {
    CIPv6Dlg &dlg = *(CIPv6Dlg *)pWnd; int RecvLen;            //接受字节数
    char RecvBuff[BuffSize+1];   //接受缓冲区
    sockaddr_in6 sa;    //IPv6地址结构
    int AddrLen;        //地址长度
    CString strMessage; sockaddr_in6 recvAddr;
            ZeroMemory(&recvAddr,sizeof(recvAddr)); int len = sizeof(recvAddr);
    AddrLen = sizeof (sa);
    ZeroMemory(&sa, sizeof(sa)); while(Flag)
    {
    RecvLen = recvfrom(s, RecvBuff,sizeof(RecvBuff),0,(SOCKADDR*)&recvAddr,&len);
    //RecvLen = recv(s,RecvBuff,BuffSize,0);  //由于recvfrom不正常,这里改用recv
    int nError = WSAGetLastError();
    if (RecvLen>0)
    {
    int n = getpeername(s, (SOCKADDR*)&recvAddr,&len);
    RecvBuff[RecvLen] = '\0';
    strMessage.Format("Received:%s",RecvBuff);
    dlg.m_ctlMessageList.SendMessage(LB_INSERTSTRING,-1,WPARAM((LPCTSTR)strMessage));
    } }
    return 1;
    }