sockaddr_in * sa_server = NULL;
sa_server = new sockaddr_in;
memset( sa_server , 0, sizeof(sockaddr_in) );
int sa_server_len = sizeof(sockaddr_in);
sockaddr_in * sa_client = NULL;
sa_client = new sockaddr_in;
memset( sa_client , 0, sizeof(sockaddr_in) );
int sa_client_len = sizeof(sockaddr_in);GetAcceptExSockaddrs( pNode->wsaBuffer.buf,                //acceptex中设定的值
   1500 - (sizeof(SOCKADDR_IN) + 16) * 2,//同上
   sizeof(SOCKADDR_IN) + 16,             //同上
                     sizeof(SOCKADDR_IN) + 16,             //同上
                     (sockaddr **) &sa_server,
                     &sa_server_len,
                     (sockaddr **) &sa_client,
                     &sa_client_len);CString strTemp;
strTemp = inet_ntoa(sa_client->sin_addr);郁闷了很久了.
大家帮帮忙,好象没什么错啊!
谢谢!

解决方案 »

  1.   


    BOOL IOCOMP_ParseAddr(LPIO_CONTEXT lpIoContext)
    /*++Function Description:       此函数在IOCOMP_HandleAccept里调用,获取刚连接上来的客户端的IP和端口,
       并保存在lpCommonObject的相应成员变量里,并判断本地端口是否是80
       如果是80,返回TRUE,否则返回FALSE。Arguments:Return Value:     如果本地端口是80,返回TRUE,否则返回FALSE。--*/
    {
    int          nLen = 0;
    LPSOCKADDR   RemoteAddr;
    LPSOCKADDR   LocalAddr;
    SOCKADDR_IN  SockAddr;
    nLen = sizeof(SOCKADDR);
    lpGetAcceptExSockAddrs(
    lpIoContext->szBuffer,
    0,
    sizeof(SOCKADDR_IN) + 16,
    sizeof(SOCKADDR_IN) + 16,
    &LocalAddr,
    &nLen,
    &RemoteAddr,
    &nLen
      );
    memcpy(&SockAddr, RemoteAddr, sizeof(struct sockaddr));
    strncpy(lpIoContext->lpCommonObject->chClientAddr, inet_ntoa(SockAddr.sin_addr),15);
    lpIoContext->lpCommonObject->nClientPort = ntohs(SockAddr.sin_port);
    //
    // 获取本地端口并判断是否是80
    // ZeroMemory(&SockAddr, sizeof(SOCKADDR_IN));
    memcpy(&SockAddr, LocalAddr, sizeof(struct sockaddr));
    if (ntohs(SockAddr.sin_port) == 80)
    {
    return TRUE;
    } return FALSE;
    }// end of IOCOMP_ParseAddr
      

  2.   

    谢谢elssann(臭屁虫和他的开心果),我试了你的代码,不能运行的啊!
    我添加了RemoteAddr = new sockaddr;
    可以运行,但还是不能得到IP啊.晕了.
      

  3.   

    不知道你调用acceptex的时候是怎么调用的 Status = lpAcceptEx(
    g_sListen[nIndex],
    lpAcceptIoContext->sClient,
    lpAcceptIoContext->wsaBuffer.buf,
    0,
    sizeof(SOCKADDR_IN) + 16,
    sizeof(SOCKADDR_IN) + 16,
    &dwBytes,
    &lpAcceptIoContext->ol
       );反正这个代码在我的程序里运行得非常正常/
      

  4.   

    我的AcceptEx是这样调用的.
    BOOL bSuccess = lpAcceptEx(m_ListenSocket,
    lpAcceptIoContext->sAimClient,
    lpAcceptIoContext->szBuffer,
    BUFFER_SIZE - (sizeof(SOCKADDR_IN) + 16) * 2,
    sizeof(SOCKADDR_IN) + 16,
    sizeof(SOCKADDR_IN) + 16,
    &dwBytes,
    &(lpAcceptIoContext->OverLapped));
      

  5.   

    我这里运行出错:指令为0xccccccccc内存该内存不能为read.
    我猜想应该是这两个指针的问题吧.
    LPSOCKADDR   RemoteAddr;
    LPSOCKADDR   LocalAddr;
    这两个只是申明了指针,但没有分配内存给它.
      

  6.   

    谢谢elssann(臭屁虫和他的开心果),
    对不起啊!
    你的代码没错.
    我先前直接调用GetAcceptExSockaddrs这个函数的,不知道为什么就不行.
    后来没使用mswsock.lib,而使用WSAIoctl函数取得指针后再调用就没问题了.呵呵,想不通为什么会这样.是不是我前面AcceptEx是使用WSAIoctl函数取得的函数指针,后面的GetAcceptExSockaddrs也必须这样做呢?