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