高分求教:如何能正确获取sockaddr中的ip地址?

tvfan1234 2003-04-28 02:29:56
我在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的地址是什么数据形式(二进制吗)。
还望高手解答!高分以谢!
...全文
805 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
用户 昵称 2003-04-30
  • 打赏
  • 举报
回复
Skt32写的很好啊,怎么会不对呢?
if(!strncmp("202.108.", buff, 7))
{
// ok,pass
}
Skt32 2003-04-29
  • 打赏
  • 举报
回复
改成 buff[0]=0
Skt32 2003-04-29
  • 打赏
  • 举报
回复

还有,把下面这句注释掉
memset(buff,0,100);
Skt32 2003-04-29
  • 打赏
  • 举报
回复
那可以将BUFFER设成全局的
hawk_yz 2003-04-29
  • 打赏
  • 举报
回复
//函数: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;
}
tvfan1234 2003-04-28
  • 打赏
  • 举报
回复
谢谢Skt32(Skt32) :我也试过这种方法,但在WSAConnect()中要求分配大的内存空间会导致运行缓慢,超时。能有更好的方法吗?
tvfan1234 2003-04-28
  • 打赏
  • 举报
回复
谢谢以上两位,一定给分。
to genty(森火) :对不起,也许我没说明白。我是在替换系统的WSAConnect()函数(也就是将以上代码加入我的WSAConnect()中(做成DLL)。我是在系统调用它时,将专递给它的参数获取与我允许得网址比较。但调试时(用IE来调用),即使输入符合条件的网址,也不能通过。


Skt32 2003-04-28
  • 打赏
  • 举报
回复

char buff[100];
memset(buff,0,100);
sprintf(buff,"%s",
inet_ntoa(name.sin_addr)
);

if(strcmp("202.108.", buff) == 7)
{
// ok,pass
}




*亮点* 2003-04-28
  • 打赏
  • 举报
回复
如果你要接收连向本程序的IP地址,先启动侦听,然后在accept里可以得到连接方的IP地址!
sccpsccp 2003-04-28
  • 打赏
  • 举报
回复
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.
sccpsccp 2003-04-28
  • 打赏
  • 举报
回复
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;
};

是一个联合类型
*亮点* 2003-04-28
  • 打赏
  • 举报
回复
SOCKADDR_IN *InetAddr =(SOCKADDR_IN *)name;//将connect的参数赋给 SOCKADDR_IN类型变量
--------------------------------
这里有点问题,connect是用来连接的,你要赋予它参数,它的返回是BOOL型,如果你要连向某个主机,你须给出主机的地址,前提是你必须知道这个地址,而如果你知道了这个地址,就可以直接进行判断了,无须在这个函数里捡取。
tvfan1234 2003-04-28
  • 打赏
  • 举报
回复
难道没人能回答吗?!

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧