18,356
社区成员
发帖
与我相关
我的任务
分享
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();
}
server_addr.sin6_port = htons(0);
不明白为什么端口是0,发广播应该是很简单的事,.255就是广播地址,你使用一个普通的发送send,往192.168.1.255上面发,同网段的其它机器都可以收到的