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

📄 ip_udp_arp.c

📁 可以在linux和wince下运行
💻 C
📖 第 1 页 / 共 3 页
字号:
{
	int i;
	for (i = 0; i < ARP_TABLE_SIZE; i++)
	{
		if (   arp_entry_table[i].ae_state != AS_FREE
			&& arp_entry_table[i].ae_ipaddr == ip)
			return &arp_entry_table[i];
	}
	return NULL;
}

/* ----------------------------------------------------------------------- *\
|*	Function:
|*		arp_find_a_free_entry()
|*
|*  Description:
|*		Find a free ARP table entry of the specified IP address.  If no
|*		entry is free, return NULL.
|*
|*  Argument:
|*		none
|*
|*  Return Value:
|*		ARP_ENTRY *:	pointer to an free ARP table entry
\* ----------------------------------------------------------------------- */
ARP_ENTRY * arp_find_a_free_entry(void)
{
	int i;
	for (i = 0; i < ARP_TABLE_SIZE; i++)
	{
		if (arp_entry_table[i].ae_state == AS_FREE)
			return &arp_entry_table[i];
	}
	return NULL;
}

char * arp_out(ULONG ip)
{
	ULONG msg_buf[4], rc;
	ARP_ENTRY * pae;

	pae = arp_find_entry(ip);

	if (pae != NULL)
	{
		if (pae->ae_state == AS_RESOLVED)
		{
			if (pae->ae_ttl != ARP_TIMER_NOTIMEOUT)
				pae->ae_ttl = ARP_TIMER_TIMEOUT;
			return pae->ae_hwaddr;
		}
		else
			return NULL;
	}
	return NULL;
}

/*************************************************************************************/
int init_udp(int stage)
{
  USHORT i,len;
  ULONG ret_val,udp_send_task_ID,udp_rece_task_ID;
  UCHAR msg[5]={"RESET"};
   UCHAR  *buff;
  int sock;
  struct sockaddr_in object, user_addr[UDP_PORT_MAX_NUM];  

  memset( (const char *)&app_to_udp_send, 0, sizeof(app_to_udp_send) );
  memset( (const char *)&udp_rece_to_app, 0, sizeof(udp_rece_to_app) );

  
  if (stage==0)
  {
  port[0]  = UDP_PORT1;
  port[1]  = UDP_PORT2;
  port[2]  = UDP_PORT3;
  port[3]  = UDP_PORT4;
  port[4]  = UDP_PORT5;
  port[5]  = UDP_PORT6;
  port[6]  = UDP_PORT7;
  port[7]  = UDP_PORT8;
  port[8]  = UDP_PORT9;
  port[9]  = UDP_PORT10;
  port[10] = UDP_PORT11;
  port[11] = UDP_PORT12;
  port[12] = UDP_PORT13;
  port[13] = UDP_PORT14;
  port[14] = UDP_PORT15;
  port[15] = UDP_PORT16;
  port[16] = UDP_PORT17;
  port[17] = UDP_PORT18;
  port[18] = UDP_PORT19;
  port[19] = UDP_PORT20;
  port[20] = UDP_PORT21;
  port[21] = UDP_PORT22;
  port[22] = UDP_PORT23;
  port[23] = UDP_PORT24;
  port[24] = UDP_PORT25;
  udp_setup=1;
  
}
else
{
      memset((const char *)&user_addr[24], 0, sizeof(struct sockaddr_in) );
       
      user_addr[24].sin_family      = AF_INET;
      user_addr[24].sin_addr.s_addr = htonl(LOCAL_IP_ADDR);
      user_addr[24].sin_port        = htons(port[24]);
     
     for(i=0;i<configdata.RemoteEndpointNumber;i++)
     {
     
      sock = socket(AF_INET, SOCK_DGRAM, UDP);
      if(sock == -1)
        {  
           ret_val=errno;
           Print("socket( %d ) ERROR %x!\n", 24,ret_val);
           return;
        }
        
      if( bind(sock, (struct sockaddr *)&user_addr[24], sizeof(user_addr[24]) )!=0 )
       {
           ret_val=errno;
         close(sock);
         Print(" bind( %d ), ERROR %x!\n",24,ret_val);	
         return;
       }
	ras_to_udp_send.port=1719;
	ras_to_udp_send.ip_addr=configdata.RemoteEndpoint[i].ip;;
	ras_to_udp_send.self_port=1719;
	ras_to_udp_send.len=5;
	ras_to_udp_send.busy=1;
	len=5;
	memcpy(&ras_to_udp_send.data[0],msg,len);

                  memset( (const char *)&object, 0, sizeof(object) );
                  object.sin_family      = AF_INET;
                  object.sin_addr.s_addr = htonl(ras_to_udp_send.ip_addr);
                  object.sin_port        = htons(ras_to_udp_send.port);                  
                  len = ras_to_udp_send.len;
                  buff = ras_to_udp_send.data;
                  ret_val = sendto(sock, buff, len, 0, (struct sockaddr *)&object, sizeof(object));	
                  if(ret_val != len)
                      { Print(" udp lan ret=%d len=%d errno=%d\n",ret_val,len,errno); }
        close(sock);
       }
}  
/* create port use quene */

/*  ret_val = q_create("UDPS", 0, Q_FIFO | Q_SYSBUF | Q_NOLIMIT, &udp_send_quene_ID);
  if(ret_val != 0) 
      {Print("Lan create send quene error !\n");
       return(-1);
      }


  ret_val = q_create("UDPR", 0, Q_FIFO | Q_SYSBUF | Q_NOLIMIT, &udp_rece_quene_ID );
  if(ret_val != 0) 
  {Print("Lan create rece quene %d error !\n",i);
       return(-1);
  }
*/
//create port use task 
/*   ret_val=t_create("UPST",150,4096,1024,0,&udp_send_task_ID);
   if(ret_val!=0) 
       {
       	Print("Lan create send task error !\n");
        return(-1);
       }

*/
/*   ret_val=t_create("UPRC",150,4096,1024,0,&udp_rece_task_ID);
   if(ret_val != 0) 
       {
       Print("Lan create rece task  error !\n");
       return(-1);
       }
*/
   
/* create UDP socket */
 
/*  for(i=0; i<UDP_PORT_MAX_NUM-1; i++)
   {
   	
     memset((const char *)&user_addr[i], 0, sizeof(struct sockaddr_in) );
       
     user_addr[i].sin_family      = AF_INET;
     user_addr[i].sin_addr.s_addr = htonl(LOCAL_IP_ADDR);
     user_addr[i].sin_port        = htons(port[i]);
     
     sock = socket(AF_INET, SOCK_DGRAM, 0);
     if(sock == -1)
        {  
           ret_val=errno;
           Print("socket( %d ) ERROR !\n", i);
           return(-1);
        }
        
     if( bind(sock, (struct sockaddr *)&user_addr[i], sizeof(user_addr[i]) )!=0 )
       {
         close(sock);
         Print(" bind( %d ), ERROR !\n",i);	
         return(-1);
       };     
       
      udp_share_sock_send[i] = shr_socket(sock, udp_send_task_ID);
//      udp_share_sock_rece[i] = shr_socket(sock, udp_rece_task_ID);	       
      close(sock);
      sock =0; 
       
   }    
*/
/* task start */
//     ret_val = t_start(udp_send_task_ID, T_SUPV|T_PREEMPT|T_TSLICE/*T_NOPREEMPT|T_NOTSLICE*/,  udp_send, 0);  
//     if(ret_val != 0) 
//       {
//       	 Print("UDP start send task error !\n");
//         return(-1);
//       }   

/*     ret_val = t_start(udp_rece_task_ID, T_SUPV|T_NOPREEMPT|T_NOTSLICE,  udp_rece, 0);  
     if(ret_val != 0) 
       {
       	 Print("UDP start rece task 0 error !\n");
         return(-1);
       }   
       udp_setup=1;
return(0);*/
  return(0);
}



int arpaddr_open(ULONG ip)
{
	ULONG rc, msg_buf[4];
	if (ip == SysVars.Lan1IP)
	{
			return 0;
	}
	else
	{
		if (   (ip & SysVars.Lan1SubnetMask)
			== (SysVars.Lan1IP & SysVars.Lan1SubnetMask))
			msg_buf[1] = ip;
		else
			msg_buf[1] = SysVars.DefGtwyIP;
	}
	msg_buf[0] = 1;/*ARP_MSG_INCREASE_REFERENCE;*/
	rc = q_send(qid_arp, msg_buf);
	if (rc != 0)
		Print("nwmgip_open: q_send to ARP QUEUE error! errno: 0x%04X\n.", rc);

	return 0;
}

int arpaddr_close(ULONG ip)
{
	ULONG rc, msg_buf[4];
	if (ip == SysVars.Lan1IP)
		return 0;

	if (   (ip & SysVars.Lan1SubnetMask)
		== (SysVars.Lan1IP & SysVars.Lan1SubnetMask))
		msg_buf[1] = ip;
	else
		msg_buf[1] = SysVars.DefGtwyIP;
	msg_buf[0] = 2;/*ARP_MSG_DECREASE_REFERENCE;*/
	rc = q_send(qid_arp, msg_buf);
	if (rc != 0)
		Print("nwmgip_open: q_send to ARP QUEUE error! errno: 0x%04X\n.", rc);

	return 0;
}


void SCH_udp_send(ULONG ip)
{
 
  long   ret_val;
  ULONG  i,mess[4],ptr;
  USHORT len;
  UCHAR  *buff;
  int opt, optsize=4;
  int sock;
  struct sockaddr_in object, user_addr[UDP_PORT_MAX_NUM];  

      memset((const char *)&user_addr[24], 0, sizeof(struct sockaddr_in) );
       
      user_addr[24].sin_family      = AF_INET;
      user_addr[24].sin_addr.s_addr = htonl(LOCAL_IP_ADDR);
      user_addr[24].sin_port        = htons(port[24]);
     
      sock = socket(AF_INET, SOCK_DGRAM, UDP);
      if(sock == -1)
        {  
           ret_val=errno;
           Print("socket( %d ) ERROR %x!\n", 24,ret_val);
           return;
        }
        
      if( bind(sock, (struct sockaddr *)&user_addr[24], sizeof(user_addr[24]) )!=0 )
       {
           ret_val=errno;
         close(sock);
//         Print(" bind( %d ), ERROR %x!\n",24,ret_val);	
         return;
       }
       opt=1;
        ret_val=setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(char *)&opt, optsize);
                  if(ret_val != 0)
                      { Print(" setsockopt ret=%d errno=%d\n",ret_val,errno); }

	ras_to_udp_send.port=1719;
	ras_to_udp_send.ip_addr=ip;
	ras_to_udp_send.self_port=1719;
	ras_to_udp_send.busy=1;
	ras_to_udp_send.data[0]='S';
	ras_to_udp_send.data[1]=LOCAL_MMC_CONNECT;
	ras_to_udp_send.data[2]=LOCAL_RECORD_IP_TABLE.TYPE;
	memcpy(&ras_to_udp_send.data[3],LOCAL_RECORD_IP_TABLE.DN,16);
	memcpy(&ras_to_udp_send.data[19],&LOCAL_RECORD_IP_TABLE.IP,4);
	memcpy(&ras_to_udp_send.data[23],&LOCAL_RECORD_IP_TABLE.R_IP,4);
	ras_to_udp_send.len=27;

                  memset( (const char *)&object, 0, sizeof(object) );
                  object.sin_family      = AF_INET;
                  object.sin_addr.s_addr = htonl(ras_to_udp_send.ip_addr);
                  object.sin_port        = htons(ras_to_udp_send.port);                  
                  len = ras_to_udp_send.len;
                  buff = ras_to_udp_send.data;
                  ret_val = sendto(sock, buff, len, 0, (struct sockaddr *)&object, sizeof(object));	
                  if(ret_val != len)
                      { Print(" udp lan ret=%d len=%d errno=%d\n",ret_val,len,errno); }
        close(sock);
}

void state_udp_send(ULONG ip,char *p)
{
 
  long   ret_val;
  ULONG  i,mess[4],ptr;
  USHORT len;
  UCHAR  *buff;
  int sock;
  struct sockaddr_in object, user_addr[UDP_PORT_MAX_NUM];  

      memset((const char *)&user_addr[24], 0, sizeof(struct sockaddr_in) );
       
      user_addr[24].sin_family      = AF_INET;
      user_addr[24].sin_addr.s_addr = htonl(LOCAL_IP_ADDR);
      user_addr[24].sin_port        = htons(1719);
     
      sock = socket(AF_INET, SOCK_DGRAM, UDP);
      if(sock == -1)
        {  
           ret_val=errno;
           Print("socket( %d ) ERROR %x!\n", 24,ret_val);
           return;
        }
        
      if( bind(sock, (struct sockaddr *)&user_addr[24], sizeof(user_addr[24]) )!=0 )
       {
           ret_val=errno;
         close(sock);
         Print(" bind( %d ), ERROR %x!\n",24,ret_val);	
         return;
       }
	ras_to_udp_send.port=1719;
	ras_to_udp_send.ip_addr=ip;;
	ras_to_udp_send.self_port=1719;
	ras_to_udp_send.busy=1;
	memcpy(&ras_to_udp_send.data[0],p,30);
	ras_to_udp_send.len=24;

                  memset( (const char *)&object, 0, sizeof(object) );
                  object.sin_family      = AF_INET;
                  object.sin_addr.s_addr = htonl(ras_to_udp_send.ip_addr);
                  object.sin_port        = htons(ras_to_udp_send.port);                  
                  len = ras_to_udp_send.len;
                  buff = ras_to_udp_send.data;
                  ret_val = sendto(sock, buff, len, 0, (struct sockaddr *)&object, sizeof(object));	
                  if(ret_val != len)
                      { Print(" udp lan ret=%d len=%d errno=%d\n",ret_val,len,errno); }
        close(sock);
}
/******************************************************************************/

/* udp send task , data from upper_layer to UDP port */
void udp_send(ULONG ip,USHORT port)
{
 
  long   ret_val;
  ULONG  i,mess[4],ptr;
  USHORT len;
  UCHAR  *buff;
  int sock;
  struct sockaddr_in object, user_addr[UDP_PORT_MAX_NUM];  

      memset((const char *)&user_addr[24], 0, sizeof(struct sockaddr_in) );
       
      user_addr[24].sin_family      = AF_INET;
      user_addr[24].sin_addr.s_addr = htonl(LOCAL_IP_ADDR);
      user_addr[24].sin_port        = htons(port);
     
      sock = socket(AF_INET, SOCK_DGRAM, UDP);
      if(sock == -1)
        {  
           ret_val=errno;
           Print("socket( %d ) ERROR %x!\n", 24,ret_val);
           return;
        }
        
      if( bind(sock, (struct sockaddr *)&user_addr[24], sizeof(user_addr[24]) )!=0 )
       {
           ret_val=errno;
         close(sock);
         Print(" bind( %d ), ERROR %x!\n",24,ret_val);	
         return;
       }
	ras_to_udp_send.port=port;
	ras_to_udp_send.ip_addr=ip;;
	ras_to_udp_send.self_port=port;
	ras_to_udp_send.busy=1;
	memcpy(&ras_to_udp_send.data[0],&comid,24);
	ras_to_udp_send.len=24;

                  memset( (const char *)&object, 0, sizeof(object) );
                  object.sin_family      = AF_INET;
                  object.sin_addr.s_addr = htonl(ras_to_udp_send.ip_addr);
                  object.sin_port        = htons(ras_to_udp_send.port);                  
                  len = ras_to_udp_send.len;
                  buff = ras_to_udp_send.data;
                  ret_val = sendto(sock, buff, len, 0, (struct sockaddr *)&object, sizeof(object));	
                  if(ret_val != len)

⌨️ 快捷键说明

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