📄 ospfh_socket.c
字号:
/*ospfh_socket.c*/
#include "ospfh.h"
#include "ospfh_patch.h"
void
ospf_sock_init ()
{
// int ospf_sock;
WSADATA WSAData;
if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0)
{
printf("WSAStartup Error!\n");
// return -1;
}
}
int
ospf_sock(struct in_addr ip_addr)
{
int ospf_sock;
int ret,hincl = 1;
struct sockaddr_in localaddr;
struct ip_mreq ipmr;
struct in_addr broad;
ospf_sock = socket (AF_INET, SOCK_RAW, IPPROTO_OSPFIGP);
if (ospf_sock < 0)
{
printf("Socket Setup Error!\n");
return -1;
}
memset(&localaddr, 0, sizeof(localaddr));
localaddr.sin_addr.s_addr = ip_addr.s_addr;
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons(0);
bind(ospf_sock, (PSOCKADDR)&localaddr, sizeof(localaddr));
//join the multicastgroup
// memset(&ipmr, 0, sizeof(ipmr));
// ipmr.imr_multiaddr.s_addr=inet_addr("224.0.0.5");
// ipmr.imr_interface.s_addr=ip_addr.s_addr;
// setsockopt(ospf_sock,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *)&ipmr,sizeof(ipmr));
// ipmr.imr_multiaddr.s_addr=inet_addr("224.0.0.6");
// setsockopt(ospf_sock,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *)&ipmr,sizeof(ipmr));
//add the broadcast ... zhitong
memset(&broad, 0, sizeof(broad));
broad.s_addr=inet_addr(BROADCAST_ADDRESS);
ret = setsockopt(ospf_sock,SOL_SOCKET,SO_BROADCAST,(char*)&broad,sizeof(broad));
/* Set precedence field. */
#ifdef IPTOS_PREC_INTERNETCONTROL
tos = IPTOS_PREC_INTERNETCONTROL;
ret = setsockopt (ospf_sock, IPPROTO_IP, IP_TOS,
(char *) &tos, sizeof (int));
if (ret < 0)
{
zlog_warn ("can't set sockopt IP_TOS %d to socket %d", tos, ospf_sock);
close (ospf_sock); /* Prevent sd leak. */
return ret;
}
#endif /* IPTOS_PREC_INTERNETCONTROL */
/* we will include IP header with packet */
ret = setsockopt (ospf_sock, IPPROTO_IP,IP_HDRINCL , (char *)&hincl, sizeof (hincl));
if (ret < 0)
{
printf("setsockopt IP_HDRINCL error!\n");
return ret;
}
#if defined (IP_PKTINFO)
ret = setsockopt (ospf_sock, IPPROTO_IP, IP_PKTINFO, &hincl, sizeof (hincl));
if (ret < 0)
{
printf("setsockopt IP_PKTINFO error!\n");
return ret;
}
#elif defined (IP_RECVIF)
ret = setsockopt (ospf_sock, IPPROTO_IP, IP_RECVIF, &hincl, sizeof (hincl));
if (ret < 0)
{
printf("setsockopt IP_RECVIF error!\n");
return ret;
}
#else
// #warning "cannot be able to receive link information on this OS"
#endif
return ospf_sock;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -