void do_ip(void *p)
{
	struct iphdr *ip = p;

	g.packet_ip++;

	if(g.print_flag_ip)
		print_ip(ip);

	void *data = ip;

	data += ip->ihl << 2;

	switch(ip->protocol)
	{
		case IPPROTO_TCP:
			do_tcp(data);
			break;
		case IPPROTO_UDP:
			do_udp(data);
			break;
		case IPPROTO_ICMP:
			do_icmp(data);
			break;
		case IPPROTO_IGMP:
			do_igmp(data);
			break;
	}
}
void do_ip( char * data )
{
	global.packet_ip ++;

	struct iphdr *pip;         
	pip = ( struct iphdr * ) data;    /* pip = point to ip layer */
	if( global.print_flag_ip )
		print_ip( pip );
	
	char * pdata = data + pip->ihl * 4;
	
	switch( pip->protocol ){
		case IPPROTO_ICMP:
			do_icmp( pdata );
			break;
		case IPPROTO_IGMP:
			do_igmp( pdata );
			break;
		case IPPROTO_TCP:
			do_tcp( pdata );
			break;
		case IPPROTO_UDP:
			do_udp( pdata );
			break;
		default:
			printf("IP: 未知其上层协议.\n");
			break;
	}
}
Exemple #3
0
int 
main(int argc, char** argv )
{
  char* config[CONFLEN];
  int logged, sup_timeout, port;

  if( argc < 2 )
  {
     fprintf(stderr, "Too few arguments\n");
     err_quit(true);
  }

  init( argv[1] , config );

  port = atoi( config[PORT] );
  if( port == 0 )
  {
    fprintf(stderr, "invalid port\n");
    exit(-1);
  }

  if( strcmp( config[PRINT_MSG], "ON" ) == 0)
    logged = LOGGED;
  else
    logged = UNLOGGED;
  
  if( strcmp( config[SUP_TIMEOUT], "ON") == 0)
    sup_timeout = ON;
  else
    sup_timeout = OFF;

  do_udp( config[ADDRESS], port, logged, sup_timeout );  

  
  /*
  int i;
  for( i=0; i<CONFLEN; i++)
  {
    printf("%s\n", config[i] );

  }
  i*/
  /*do_udp( "0.0.0.0", 20202, LOGGED, 0);*/

  return 0;
}
Exemple #4
0
int
main(int argc, char **argv)
{
    int                  cc;
    uint32_t             port;
    uint32_t             udp;
    struct sockaddr_in   addr;
    socklen_t            one;

    /* bah default port
     */
    port = 8765;
    udp = 0;
    while ((cc = getopt(argc, argv, "hup:")) != EOF) {
        switch (cc) {
            case 'h':
                usage();
                return -1;
            case 'p':
                port = atoi(optarg);
                break;
            case 'u':
                udp = 1;
                break;
            case '?':
                usage();
                return -1;
        }
    }

    /* Get the mother socket
     */
    if (udp)
        Sock = socket(AF_INET, SOCK_DGRAM, 0);
    else
        Sock = socket(AF_INET, SOCK_STREAM, 0);
    if (Sock < 0) {
        perror("socket()");
        return -1;
    }

    one = 1;
    setsockopt(Sock,
               SOL_SOCKET,
               SO_REUSEADDR,
               &one,
               sizeof(socklen_t));

    for (cc = 0; cc < MAXCONN; cc++)
        conn[cc] = -1;

    /* bind() it to a specified port
     */
    addr.sin_family      = AF_INET;
    addr.sin_port        = htons(port);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);

    cc = bind(Sock,
              (struct sockaddr *)&addr,
              sizeof(struct sockaddr_in));
    if (cc < 0) {
        perror("bind()");
        return -1;
    }

    fprintf(stderr, "\
%d:%lu: socket %d to port %d bind() all right\n",
            getpid(), time(NULL), Sock, port);

    if (!udp)
        listen(Sock, SOMAXCONN);

    if (udp)
        do_udp();
    else
        do_tcp();

    return 0;
}