IPV6广播的的问题?

na_he 2010-10-18 10:57:55
现将原有的IP4的广播程式支持IP6,程序可以发送成功,但接受只有本机可以接受到广播信息,局域网内的其他机器不能收到。现有两个问题请教:

1.IP6组播或者或者广播的地址是不是特定的,是多少呢?我目前用几个尝试了,好像都不可以。不如::1等。


2.inet_ntop函数怎么使用不了呢。在VS2008下提示ws2_32.dll找不到入口点.

int resolve_v6 (const char * hostname,	struct sockaddr_in6* addr) 
{
struct addrinfo hints;
struct addrinfo *result;
memset (&hints, 0, sizeof (struct addrinfo));
hints.ai_family = AF_INET6;
getaddrinfo (hostname, NULL, &hints, &result);
// assert(sizeof(struct sockaddr_in6)==result->ai_addrlen);
memcpy (addr, result->ai_addr, result->ai_addrlen);
freeaddrinfo (result);
return 0;
}

void main(int argc, char **argv)
{
WSADATA wsaData;
SOCKET sockListener;
SOCKADDR_IN saUdpCli,saUdpServ;
BOOL fBroadcast = TRUE;


char sendBuff[40]= //SNMP查询包内容
{
'\x30','\x26','\x02','\x01','\x00',
'\x04','\x06','\x70','\x75','\x62',
'\x6c','\x69','\x63','\xa0','\x19',
'\x02','\x01','\x03','\x02','\x01',
'\x00','\x02','\x01','\x00','\x30',
'\x0e','\x30','\x0c','\x06','\x08',
'\x2b','\x06','\x01','\x02','\x01',
'\x01','\x01','\x00','\x05','\x00'
};
char recvBuff[600];
int nSize,err,timeoutnum = 1;;
ULONG HostIpAddr;
int rv;
int ncount=0;

if(WSAStartup(MAKEWORD( 2, 2),&wsaData)!=0)
{
printf("Winsocket start error!\n");
return;
}
memset (&saUdpCli, 0, sizeof (saUdpCli));

struct sockaddr_in6 server_addr;
memset((void *)&server_addr,0,sizeof(server_addr));
;

server_addr.sin6_family = AF_INET6 ; /* ipv6 */
server_addr.sin6_port = htons(0);
server_addr.sin6_addr = in6addr_any;

if(bind (listen_fd, (SOCKADDR *)&server_addr, sizeof (struct sockaddr_in6))!=0)
{
printf("Can't bind socket to local port!Program stop.\n");
return;
}

struct sockaddr_in6 addrsvr;
memset (&addrsvr, 0, sizeof (sockaddr_in6));

err = gethostname(recvBuff,sizeof(recvBuff));
resolve_v6("FF12::1",&addrsvr);//"fe80::54d2::6be3:410a:9438%11"
addrsvr.sin6_family=AF_INET6;
addrsvr.sin6_port=htons(161);
if((rv = sendto ( listen_fd,
sendBuff,
sizeof(sendBuff),0,
(SOCKADDR *) &addrsvr,
sizeof ( struct sockaddr_in6 )))==SOCKET_ERROR)
{
printf("Send error!\n");
closesocket(sockListener);
return;
}
printf("Send successful!\n");


struct sockaddr_in6 client_addr;
memset((void *)&client_addr,0,sizeof(client_addr));
int sockaddr_len = sizeof(struct sockaddr_in6);

do // waiting to receive
{
if((rv=recvfrom ( listen_fd,
recvBuff,sizeof(recvBuff),0,
(SOCKADDR *) &client_addr,&sockaddr_len))==SOCKET_ERROR)
{
if(WSAGetLastError()==WSAETIMEDOUT)
{
if (timeoutnum > 1 ) //Wait for 1 minute.
break;
else
timeoutnum++;
//sprintf("Error \n");

}
}
else
{
char szIP[256];
//strcpy(szIP,inet_ntoa ( saUdpCli.sin_addr));
// CString Ip(inet_ntoa ( saUdpCli.sin_addr ));

// sprintf("\t IP Adress->%s \n",szIP);
}

}while(TRUE);
closesocket(sockListener);
WSACleanup();
}
...全文
211 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
na_he 2010-10-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 visualeleven 的回复:]
inet_ntop?inet_ntoa?
[/Quote]

inet_ntop因为要把IPV6的地址转化为文本的格式。
Eleven 2010-10-18
  • 打赏
  • 举报
回复
inet_ntop?inet_ntoa?
周江涛 2010-10-18
  • 打赏
  • 举报
回复
server_addr.sin6_port = htons(0);
不明白为什么端口是0,发广播应该是很简单的事,.255就是广播地址,你使用一个普通的发送send,往192.168.1.255上面发,同网段的其它机器都可以收到的

18,356

社区成员

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

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