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

📄 icu.c

📁 select programe, 1 raw socket2 udp socket.
💻 C
字号:
//	gcc -g -O2 -D_REENTRANT -Wall -o icu icu.c ./libunp.a -lrt -lpthread

//
//	TITLE:
//
//	DESCRIPTION:
//		main programme of icu, managing with network data  
//		current version based on mcu6 ver4.1
//	REFER to	"SiTracs system design.doc"
//
//	FILENAME:
//		icu.c
//
//	AUTHOR(S):
//		Andrew Dai(mailto:andrew.x.dai@gmail.com	)
//
//	CREATION DATE:
//		date from: 2007-5-1
//
//	MODIFICATION HISTORY:
//
//
//

/*		toDo list
	
	defination of 3 NICs, udp socket listen to a specific NIC
	all parameters defined in a configuration file	-->	designing a management approach
	implement of locking mechanism
	

*/

#include	"icu.h"
#include	"tc12mes.h"
#include	"mcu6.h"
#include	"trm.h"
#include	"timer.h"


void 
die(char *why, int n) 
{ 
  perror(why); 
  syslog(LOG_ERR|LOG_USER, why);
  exit(n); 
} 

void 
sys_log(const char *fmt, ... )
{
#if  LEVEL(1)
	va_list		ap;
	va_start(ap, fmt);
	printf(fmt, ap);
	printf("\n");
	syslog(LOG_INFO|LOG_USER, fmt, ap);
	va_end(ap);
#endif
	return;
}

void 
printHex(unsigned char p[], unsigned short len, char *str)
{
#if  LEVEL(1)
	int i;
	printf("%s\t\"", str);
	for (i=0; i<len; i++ )
	{
		printf("%02X ",p[i]);
	}
	printf("\"\n");
#endif
}

void *
myStrcpy(size_1 *d,size_1 *s, size_4 len)
{
	size_4 j;
	for (j=0; j<len;j++ )
	{
		d[j]=s[j];
	}
	return d;
}

size_1
myStrcmp(size_1 *d,size_1 *s, size_4 len)
{
	size_4 j;
	for (j=0; j<len;j++ )
	{
		if(d[j]!=s[j]) return FALSE;
	}
	return TRUE;
}


void 
do_promisc(char *nif, int sock ) 
{ 
	struct ifreq ifr; 
	
	strncpy(ifr.ifr_name, nif,strlen(nif)+1); 
  	if((ioctl(sock, SIOCGIFFLAGS, &ifr) == -1)) 
  	{        
    	die("ioctl", 2); 
  	} 
  	ifr.ifr_flags |= IFF_PROMISC; 
  	
  	if(ioctl(sock, SIOCSIFFLAGS, &ifr) == -1 ) 
  	{ 
  	  die("ioctl", 3); 
  	} 
}

 /*	 refer to:	man 7 netdevice	 */
int
getEthernetAddr(const char *dev, unsigned char *addr)		/* Get the ethernet address for the given device name */
{
        struct ifreq ifr;
        int ioctl_sockid;

        bzero((char *)&ifr, sizeof(ifr));
        strcpy(ifr.ifr_name, dev);
        if ((ioctl_sockid = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
                return (-1);

        if (ioctl(ioctl_sockid, SIOCGIFHWADDR, (char *)&ifr) < 0)
                return(-1);

        memcpy(addr, (unsigned char *) &ifr.ifr_hwaddr.sa_data, ETH_ALEN);
        return(0);
} 

int
main(int argc, char **argv)
{
	sys_log("#PROGRAM_NAME started." );

/*	create listening RAW PACKET socket */
	if (getEthernetAddr(NIC_SCOOT, MyMac)) die("there is no nic for scoot", 1 );
	if((packet_fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) die("raw socket error", 1);   
	do_promisc(NIC_SCOOT, packet_fd);

/*	create UDP for MCU6 socket */
/*	i donot know why the below fd return 0
	if((udp_mcu6_fd = socket(AF_INET, SOCK_DGRAM, 0)==-1)) die("UDP socket for MCU6 error",1);
*/
	udp_mcu6_fd = socket(AF_INET, SOCK_DGRAM, 0);
	bzero(&udp_mcu6_serv_addr, sizeof(udp_mcu6_serv_addr));
	udp_mcu6_serv_addr.sin_family      = AF_INET;
	udp_mcu6_serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	udp_mcu6_serv_addr.sin_port        = htons(UDP_PORT_FOR_MCU6);
	bind(udp_mcu6_fd, (SA *) &udp_mcu6_serv_addr, sizeof(udp_mcu6_serv_addr));

/*	create UDP for TERMINAL socket */
//	if((udp_terminal_fd = socket(AF_INET, SOCK_DGRAM, 0)==-1)) die("UDP socket for TERMINAL error",1);
	udp_terminal_fd = socket(AF_INET, SOCK_DGRAM, 0);
	bzero(&udp_mcu6_serv_addr, sizeof(udp_mcu6_serv_addr));
	udp_terminal_serv_addr.sin_family      = AF_INET;
	udp_terminal_serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	udp_terminal_serv_addr.sin_port        = htons(UDP_PORT_FOR_TERMINAL);
	bind(udp_terminal_fd, (SA *) &udp_terminal_serv_addr, sizeof(udp_terminal_serv_addr));

/*	create a timer mechanism */
	if(create_timer (TIMER_INTERVAL, TIMER_ID)) die("timer creat error",1);

/*	setup select */
	FD_ZERO(&rset);
	maxfdp1 = max(max(packet_fd, udp_mcu6_fd),udp_terminal_fd) + 1;
	for ( ; ; ) {
		FD_SET(packet_fd, &rset);
		FD_SET(udp_mcu6_fd, &rset);
		FD_SET(udp_terminal_fd, &rset);

		if ( (nready = select(maxfdp1, &rset, NULL, NULL, NULL)) < 0) {
			if (errno == EINTR)
				continue;		/* back to for() */
			else
				sys_log("select error");
		}

/*	handles packet from TCC	*/
		if (FD_ISSET(packet_fd, &rset)) {
	    	socket_addr_len = sizeof(packet_addr); 
	    	bytes_received = recvfrom(packet_fd, (char *)packet_r_buf, sizeof(packet_r_buf), 0, (SA *)&packet_addr, &socket_addr_len); 
	    	packet_r_buf[bytes_received] = 0; 
			ptemp = packet_r_buf;
			peth = (struct ethhdr *)ptemp;

			if (checkupPacket())
			{
#if  LEVEL(1)
				printf("------------------------------> received a packet, len=\t%d\n",bytes_received);
				printHex(peth->h_dest,6,"dest=");
				printHex(peth->h_source,6,"src=");
				printHex((unsigned char *) &(peth->h_proto),2,"proto=");
				printHex(ptemp+= sizeof(struct ethhdr),bytes_received-sizeof(struct ethhdr),"packet=");
#endif
				onPacket();
			}


//			sendto(packet_fd, (char *)packet_r_buf, bytes_received, 0, (SA *)&packet_addr, socket_addr_len);
			continue;

		}

/*	handles udp packet from MCU6	*/
		if (FD_ISSET(udp_mcu6_fd, &rset)) {
			socket_addr_len = sizeof(udp_mcu6_cli_addr);
			bytes_received = recvfrom(udp_mcu6_fd, udp_mcu6_buf, sizeof(udp_mcu6_buf), 0, \
				(SA *) &udp_mcu6_cli_addr, &socket_addr_len);

			if(verifyMCU6(udp_mcu6_buf, bytes_received)!=0) {
				sys_log("not valid upd");
				continue;		/* back to for() */
			}

			pmcu6_to_icu=(MCU6_TO_ICU *)udp_mcu6_buf;
			
			showOTUmessage((MCU6_TO_ICU *) pmcu6_to_icu);

			fillupOTUmessage((MCU6_TO_ICU *) pmcu6_to_icu, (SA *) &udp_mcu6_cli_addr);
//			generateOTUreply();
			

//			sendto(udp_mcu6_fd, udp_mcu6_buf, bytes_received, 0, (SA *) &udp_mcu6_cli_addr, socket_addr_len);
		}

/*	handles udp packet from terminal	*/
		if (FD_ISSET(udp_terminal_fd, &rset)) {
			socket_addr_len = sizeof(udp_terminal_cli_addr);
			bytes_received = recvfrom(udp_terminal_fd, udp_terminal_buf, sizeof(udp_terminal_buf), 0, \
				(SA *) &udp_terminal_cli_addr, &socket_addr_len);
			sendto(udp_terminal_fd, udp_terminal_buf, bytes_received, 0, (SA *) &udp_terminal_cli_addr, socket_addr_len);
		}
	}
}

⌨️ 快捷键说明

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