我在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的地址是什么数据形式(二进制吗)。
还望高手解答!高分以谢!
的通过)。
获取 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的地址是什么数据形式(二进制吗)。
还望高手解答!高分以谢!
--------------------------------
这里有点问题,connect是用来连接的,你要赋予它参数,它的返回是BOOL型,如果你要连向某个主机,你须给出主机的地址,前提是你必须知道这个地址,而如果你知道了这个地址,就可以直接进行判断了,无须在这个函数里捡取。
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;
};是一个联合类型
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.
char buff[100];
memset(buff,0,100);
sprintf(buff,"%s",
inet_ntoa(name.sin_addr)
); if(strcmp("202.108.", buff) == 7)
{
// ok,pass
}
to genty(森火) :对不起,也许我没说明白。我是在替换系统的WSAConnect()函数(也就是将以上代码加入我的WSAConnect()中(做成DLL)。我是在系统调用它时,将专递给它的参数获取与我允许得网址比较。但调试时(用IE来调用),即使输入符合条件的网址,也不能通过。
//功能:得到本机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;
}
还有,把下面这句注释掉
memset(buff,0,100);
if(!strncmp("202.108.", buff, 7))
{
// ok,pass
}