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

📄 aodvsocket.cc

📁 AODV
💻 CC
字号:
/************************************************************************			       ---AODV-UIUC---			       This software can be used under GNU General Public License.Author: Binita Gupta <binita@uiuc.edu>	University of Illinois, Urbana-Champaign************************************************************************/#include "common.h"#include "externDec.h"/* create a new socket */int	aodvSocket::createSock(char *interface, struct sockaddr_in *addr){	sock = init_socket(interface);	if(sock < 0)	{		cout << "Error creating aodv socket"  << endl;		return -1;	}	if( bind_socket(sock,addr) < 0)		return -1;	return 0;}/* read data from the aodv socket */int	aodvSocket::readFromSock(struct aodvData *data){	//AODV_Msg 	*aodv_msg;	int	len;	    struct sockaddr_in src_addr;	    struct msghdr msg;	    union control_union{		struct cmsghdr cm;		char control[CMSG_SPACE(sizeof(int)) +			     CMSG_SPACE(sizeof(struct in_pktinfo))];	    };		union control_union control_un;	    struct cmsghdr *cmsg;		char	*cmsgPtr;	    struct in_pktinfo pktinfo;	    socklen_t	addr_len;	    int	recvTTL=0;		memset(&src_addr,0,sizeof(struct sockaddr_in));	    msg.msg_name = NULL;	    msg.msg_namelen = 0;	    msg.msg_iov = NULL;	    msg.msg_iovlen = 0;	    msg.msg_control = control_un.control;	    msg.msg_controllen = sizeof(control_un.control);	    /* Get the information control message first */	    if ((len = recvmsg(sock, &msg, MSG_PEEK)) < 0) {			cout << "Error in recvmsg " << endl;			return -1;	    }		addr_len = sizeof(struct sockaddr_in);	    /* Read the data payload (i.e. AODV msg) */	    len = recvfrom(sock, recvBuffer, AODVBUFSIZE, 0,			   (struct sockaddr *) &src_addr, &addr_len);	    if (len < 0) {		    cout << "aodv socket: error in recvfrom " << endl;			return -1;	    }	    u_int32_t	src = (src_addr.sin_addr.s_addr);#ifdef DEBUG		cout << " readFromSock: src address is " << getDotIP(src) << endl;		cout << " readFromSock: local node address is " << getDotIP(g_my_ip) << endl;#endif		data->src_ip = src;	    /* ignore all messages received from the local node */	    if(src == g_my_ip)		    return 0;	            cmsg = CMSG_FIRSTHDR(&msg);	    if(msg.msg_controllen == 40) {		for (int i = 0; i < 2; i++) {			if (cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_TTL) {			    memcpy(&recvTTL, CMSG_DATA(cmsg), sizeof(int));				cmsgPtr = (char*)cmsg;			    cmsgPtr =  cmsgPtr + CMSG_SPACE(sizeof(int));				cmsg = (struct cmsghdr *)cmsgPtr;			} else if (cmsg->cmsg_level == SOL_IP				   && cmsg->cmsg_type == IP_PKTINFO) {			    memcpy(&pktinfo, CMSG_DATA(cmsg), sizeof(struct in_pktinfo));				cmsgPtr = (char*)cmsg;			    cmsgPtr =  cmsgPtr + CMSG_SPACE(sizeof(struct in_pktinfo));				cmsg = (struct cmsghdr *)cmsgPtr;			}		}        }				else			cout <<" read From AODV socket: header not found " << endl;#ifdef DEBUG		cout << "readFromSocket: ttl received is " << recvTTL << endl;#endif	data->dest_ip = (pktinfo.ipi_addr.s_addr);	data->ttl = (recvTTL);#ifdef DEBUG	cout << " readFromSock: src address is " << getDotIP(data->src_ip) << endl;	cout << " readFromSock: dest address is " << getDotIP(data->dest_ip) << endl;	cout << " readFromSock: local node address is " << getDotIP(g_my_ip) << endl;	cout << " readFromSock: ttl is " << data->ttl << endl;#endif	return len;}/* initialize aodv socket */int 	aodvSocket::init_socket (char *IF){	  int fd;	  int on = 1;	  int b_cast = 1;	  int	pri=0;	  int type = SOCK_DGRAM;	  /* Get socket for UDP or TCP */	  if ((fd = socket(AF_INET, type, 0)) == -1)	    /* Error creating socket */	    return -1;	  /* Setting socket to only listen to out device (and not loopback) */	  if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, IF,			 (size_t)((strlen(IF)+1)*sizeof(char))) < 0)	    /* Error in setting socket */	    return -1;	  /* Setting socket so that more than one process can use the address */	  if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)	    /* Error in setting socket */	    return -1;	  /* Listen to broadcast as well? */	  if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &b_cast, sizeof(b_cast)) < 0)	    /* Error in setting socket */	    return -1;	  /* set socket priority */	  if (setsockopt(fd, SOL_SOCKET, SO_PRIORITY , &pri, sizeof(pri)) < 0)		  return -1;	  /* set option to receive IP_TTL for received messages. */  	  if (setsockopt(fd, SOL_IP, IP_RECVTTL, &on, sizeof(on)) < 0)		return -1;  	  /* set option to receive PKTINFO for received messages. */  	  if (setsockopt(fd, SOL_IP, IP_PKTINFO, &on, sizeof(on)) < 0)		return -1;	  return fd;}int 	aodvSocket::bind_socket (int fd, struct sockaddr_in *addr){	  addr->sin_family = AF_INET;	  addr->sin_port = htons(AODV_PORT);	  bzero(&(addr->sin_zero), 8);	  addr->sin_addr.s_addr=INADDR_ANY;	  /* bind aodv socket to my address */	  if (bind(fd, (struct sockaddr *)addr, sizeof(struct sockaddr)) == -1)	    return -1;	  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -