我在Connect函数中(将原有的替换成我自己的),添加代码以进行网址比较(只让允许
的通过)。
获取 const struct sockaddr FAR * name 参数中的地址结构,具体获取代码如下: 
SOCKADDR_IN *InetAddr =(SOCKADDR_IN *)name;//将connect的参数赋给 SOCKADDR_IN类型变量
DWORD *InetIp=(DWORD*)&InetAddr->sin_addr;//转换为双字
DWORD InetIphontl=htonl(*InetIp); //转换为网络字节顺序
BYTE IsAccessIp[4];
memcpy(IsAccessIp,&InetIphontl,sizeof(DWORD));//将地址内容放入BYTE变量中用于后面判断
if(!(IsAccessIp[3]==202&&IsAccessIp[2]==108&&)  //判断只要地址为:202。108。*。* 就放行
但在调试中,此方法不能通过(调试的地址就为程序中的)。
我错在那呢?
还有一问题:套节字中的SOCKADDR_IN-〉SIN_ADDR的地址是什么数据形式(二进制吗)。
还望高手解答!高分以谢!

解决方案 »

  1.   

    SOCKADDR_IN *InetAddr =(SOCKADDR_IN *)name;//将connect的参数赋给 SOCKADDR_IN类型变量
    --------------------------------
    这里有点问题,connect是用来连接的,你要赋予它参数,它的返回是BOOL型,如果你要连向某个主机,你须给出主机的地址,前提是你必须知道这个地址,而如果你知道了这个地址,就可以直接进行判断了,无须在这个函数里捡取。
      

  2.   

    struct in_addr {
      union {
              struct { u_char s_b1,s_b2,s_b3,s_b4; }   S_un_b;
              struct { u_short s_w1,s_w2; }            S_un_w;
              u_long                                   S_addr;
      } S_un;
    };是一个联合类型
      

  3.   

    Members
    S_un_b 
    Address of the host formatted as four u_chars. 
    S_un_w 
    Address of the host formatted as two u_shorts. 
    S_addr 
    Address of the host formatted as a u_long.
      

  4.   

    如果你要接收连向本程序的IP地址,先启动侦听,然后在accept里可以得到连接方的IP地址!
      

  5.   


             char buff[100];
             memset(buff,0,100);
    sprintf(buff,"%s",
    inet_ntoa(name.sin_addr)
    );       if(strcmp("202.108.", buff) == 7)
    {
       // ok,pass
    }
      

  6.   

    谢谢以上两位,一定给分。
    to genty(森火) :对不起,也许我没说明白。我是在替换系统的WSAConnect()函数(也就是将以上代码加入我的WSAConnect()中(做成DLL)。我是在系统调用它时,将专递给它的参数获取与我允许得网址比较。但调试时(用IE来调用),即使输入符合条件的网址,也不能通过。
      

  7.   

    谢谢Skt32(Skt32) :我也试过这种方法,但在WSAConnect()中要求分配大的内存空间会导致运行缓慢,超时。能有更好的方法吗?
      

  8.   

    //函数:int GetLocalIpAddr()
    //功能:得到本机IP地址,并将其显示在combox中
    int GetLocalIpAddr()
    {
    struct hostent *pHostent;
    struct in_addr *sin_addr;
    char HostName[256];
    char **pTemp;

    gethostname(HostName, 255);
    HostName[255] = '\0';

    pHostent = gethostbyname(HostName);

    if (pHostent == NULL)
    {
    return -1;//错误处理
    }
    else
    { //pHostent->h_name 主机名//pHostent->h_aliase别名//pHostent->h_length 地址个数
    switch(pHostent->h_addrtype)
    {
    case AF_INET://IPV4
    for(pTemp=pHostent->h_addr_list; *pTemp!=NULL; pTemp++)
    {
    sin_addr = (struct in_addr*)*pTemp;
    //inet_ntoa(*sin_addr);//转换成string
    SendMessage(GetDlgItem(hDialog,IDC_COMBO),CB_ADDSTRING,0,LPARAM(inet_ntoa(*sin_addr)));
    }
    break;
    }
    } return pHostent->h_length;
    }
      

  9.   


    还有,把下面这句注释掉
    memset(buff,0,100);
      

  10.   

    Skt32写的很好啊,怎么会不对呢?
    if(!strncmp("202.108.", buff, 7))
    {
       // ok,pass
    }