예제 #1
0
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;
	}
}
예제 #2
0
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;
	}
}
예제 #3
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;
}