急求毕设问题,怎样获得本机ipv6地址(winsock下)?

蛐蛐蛐 2006-05-16 10:09:26
这个问题已经纠缠好些天了,郁闷啊..
感觉winsock中对ipv6的地址支持的并不好,虽然官方的解释是getaddrinfo和getnameinfo已经可以完成所有的地址解析工作,但是个人觉得用起来很不方便,如inet_ntoa之类的简单转换都很难实现,哪位高手讲一讲吧,下面是代码:
char szHostName[256];
gethostname(szHostName,256);
struct addrinfo hints2, *res2=NULL;
memset(&hints2,0,sizeof(hints2));
hints2.ai_flags=AI_CANONNAME;
hints2.ai_family=AF_INET6;
rc=getaddrinfo(szHostName,"10000",&hints2,&res2);
char *v6IP=res2->ai_addr->sa_data;
char hostName[256];
char servInfo[256];
if ((getnameinfo(res2->ai_addr,
res2->ai_addrlen,
hostName,
256,
servInfo,
256,
NI_NUMERICHOST | NI_NUMERICSERV)) != 0)
{
printf("getnameinfo() failed.\n");
printf("Error #: %ld\n", WSAGetLastError());
return 0;
}
这样只能获得本机的回路地址,即::1
怎样获得本机的链路本地和全球单播地址呢,希望是和网卡无关的,即不需要选择网卡index,十分感谢!
...全文
484 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xx_jj 2006-05-22
  • 打赏
  • 举报
回复
呵呵 认真
striking 2006-05-22
  • 打赏
  • 举报
回复
你的cpp 有没有 include stdafx.h
蛐蛐蛐 2006-05-22
  • 打赏
  • 举报
回复
不好意思,我太笨了,还是相同的错误.
都不好意思麻烦你了!
striking 2006-05-22
  • 打赏
  • 举报
回复
#ifndef aaaaaaaaa
#define aaaaaaaaa

void l2ip(const struct in6_addr& ip, std::string& str)
....
void GetLocalIpV6( char * szIPV6Buffer );
...

#endif
蛐蛐蛐 2006-05-22
  • 打赏
  • 举报
回复
e:\software\platformsdk\include\ipexport.h(23) : error C2146: syntax error : missing ';' before identifier 'IPAddr'
e:\software\platformsdk\include\ipexport.h(23) : fatal error C1004: unexpected end of file found


这个文件夹中的platformsdk是从VS2005中拷的,并且已经在directories中设置为第一个.
还想请教你一个问题,我得到局域网中的其他主机的链路本地地址以后,再用connect,为什么除了本机以外其他的地址都不可达,不知道你有这方面的经验没有,谢谢啦!!:)
striking 2006-05-22
  • 打赏
  • 举报
回复
编译出现什么问题
蛐蛐蛐 2006-05-22
  • 打赏
  • 举报
回复
striking你好!
我用的是VS2005的SDK,但是编译的时候还是有问题,不知道应该用那个版本的?
还有就是想请教你PLATFORM SDK应该在哪下载?好像microsoft的网站上太慢,不可能下下来吧
麻烦你回答菜鸟问题:)
striking 2006-05-21
  • 打赏
  • 举报
回复
下载PLATFORM SDK

#include <IPExport.h>
void l2ip(const struct in6_addr& ip, std::string& str)
{
char slask[100]; // l2ip temporary
*slask = 0;
unsigned int prev = 0;
bool skipped = false;
bool ok_to_skip = true;

{
for (size_t i = 0; i < 16; i++)
{
unsigned int x = ntohs(ip.u.Byte[i]);
if (*slask && (x || !ok_to_skip || prev))
strcat(slask,":");
if (x || !ok_to_skip)
{
sprintf(slask + strlen(slask),"%X", x);
if (x && skipped)
ok_to_skip = false;
}
else
{
skipped = true;
}
prev = x;
}
}
str = slask;
}

void GetLocalIpV6( char * szIPV6Buffer )
{
char name[256];

*name = 0;
PHOSTENT hostinfo;
if( gethostname ( name, sizeof(name)) == 0)
{
if((hostinfo = gethostbyname(name)) == NULL)
{
//error;....
}
}

struct in6_addr local_ip6;
memset(&local_ip6, 0, sizeof(local_ip6));

memcpy(&local_ip6,hostinfo -> h_addr_list[0],hostinfo -> h_length);

string s;
l2ip( local_ip6, s );

strcpy( szIPV6Buffer, s.c_str() );
}
hechunhao913 2006-05-21
  • 打赏
  • 举报
回复
兄弟我的毕设也是这个问题给卡住了,不知道你现在怎么样了?如果解决了,哪我就向你请教了.]
QQ:172030258
EMAIL:vernal_man01@126.com
oyljerry 2006-05-16
  • 打赏
  • 举报
回复
链路地址是MAC地址吧,单播是IP吧
jacklzw88 2006-05-16
  • 打赏
  • 举报
回复
链路本地和全球单播地址,回路地址这都是第一次听见
蛐蛐蛐 2006-05-16
  • 打赏
  • 举报
回复
再说明一下,我的系统是XP,记得在windows 2003下使用上述方法可以获得所有的ipv6地址列表.
LeiShi 2006-05-16
  • 打赏
  • 举报
回复
winpcap

Try it!
蛐蛐蛐 2006-05-16
  • 打赏
  • 举报
回复
师兄告诉了一个获得链路本地的方法:通过获得Mac地址按照地址转换方法可以得到链路本地地址.终于有点突破了:)
周江涛 2006-05-16
  • 打赏
  • 举报
回复
提供以ipv6的支持。
->
提供对ipv6的支持。
周江涛 2006-05-16
  • 打赏
  • 举报
回复
以上得到的也只是ipv4地址。目前还没有任何一个windows版本提供以ipv6的支持。
在PB中使用WINSOCK.OCX做双向通信的简单例子----PowerBuilder 一、在窗口中添加WINSOCK控件:   在应用中新开一个窗口,在窗口画板中点击controls-->OLE菜单项,弹出 Insert object窗口,单击Insert control标签,从列表框中双击选定 Microsoft Winsock control,将winsock的图标贴在窗口上。   在程序中该控件名称定为winsock_a(甲方)和winsock_b(乙方)。   二、设置信息输入输出文本框:   在窗口中增加一个按钮cb_1,两个单行文本框sle_1,sle_2,分别用于输入 要发送的字符串和接受对方发送的字符串。   三、设置通讯协议:   WINSOCK控件允许用户以UDP和TCP两种协议中任选一种进行通讯。   1.UDP协议设置:UDP协议是一种无连接的通讯协议,在通讯之前,需要绑 定remotehost和remoteport属性,如果需要双向通讯,还要设置localport属性 。   在甲方(本机地址为:134.1.1.1)窗口的Open事件中加入如下语句: winsock_a.object.protocol=1 //winsock通讯协议设为UDP协议 winsock_a.object.remotehost="134.1.1.2" //对方的ip地址 winsock_a.object.remoteport=6000 //对方的winsock通讯端口号 winsock_a.object.localport=6001 //本机winsock通讯端口号 winsock_a.object.bind //绑定通讯协议   在乙方(本机地址为:134.1.1.2)窗口的Open事件中加入如下语句: winsock_b.object.protocol=1 //winsock通讯协议设为UDP协议 winsock_b.object.remotehost="134.1.1.1" //对方的ip地址 winsock_b.object.remoteport=6001 //对方的winsock通讯端口号 winsock_b.object.localport=6000 //本机winsock通讯端口号 winsock_b.object.bin //绑定通讯协议   2.TCP协议设置:TCP协议在通讯前需要进行连接。   在甲方(作为服务器端)窗口的Open事件中加入如下语句: winsock_a.object.protocol=0 //winsock通讯协议设为TCP协议 winsock_a.object.localport=6001 //本机winsock通讯端口号 winsock_a.listen() //启动监听   在甲方winsock_a控件的Connectionrequest事件中加入如下语句: //接受到对方的连接请求后 if winsock_a.object.state0 then winsock_a.close() end if winsock_a.accept(requestID) //建立直接连接 //requestID是Connectionrequest事件自己的参数   在乙方(作为客户端)窗口的Open事件中加入如下语句: winsock_b.object.protocol=0 //winsock通讯协议设为TCP协议 winsock_b.object.remotehost="134.1.1.2" //对方的ip地址 winsock_b.object.remoteport=6000 //对方的winsock通讯端口号 winsock_b.connect() //发出连接请求   3.无论采用哪种协议,都要在窗口的Close事件中加入如下语句: if winsock_a/*或winsock_b*/.object.state0 then winsock_a.close() end if   否则可能第二次使用时发生异常问题   四、开始通讯   在按钮cb_1(caption属性设为‘发送’)的click事件中加入如下语句: winsock_a/*或winsock_b*/.object.send (sle_1.text)   在winsock_a/*或winsock_b*/控件的dataarrival事件中加入如下语句: //接受到对方数据后 string datastr1 winsock_a/*或winsock_b*/.object.getdata (def datastr1) sle_2.text=datastr1 //将数据字符串显示在文本框中   以上程序实际上体现了聊天器的底层工作原理,稍加修改扩充就可以做成

18,356

社区成员

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

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