⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ospfh_socket.c

📁 实现禁位自动排列在禁位中具体实现了此方法所以这是一个创新很有应用价值在VC平台上调试通过
💻 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 + -