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; } }
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; }
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; }