Exemplo n.º 1
0
int main(int argc, char const *argv[])
{
	int family = AF_INET;

	if (!(argc ==3 || argc ==4))
		err_sys("input args: address port");
	if (argc == 4)
		family = AF_INET6;

	struct sockaddr *serv_addr;
	socklen_t serv_len;
	if (family == AF_INET){
		serv_addr = (struct sockaddr*)v4_addr(family, atoi(argv[2]), argv[1]);
		serv_len = sizeof(struct sockaddr_in);
	}
	else {
		serv_addr = (struct sockaddr*)v6_addr(family, atoi(argv[2]), argv[1]);
		serv_len = sizeof(struct sockaddr_in6);
	}
	
	int clientfd = Socket(family, SOCK_STREAM, IPPROTO_TCP);
	Connect(clientfd, serv_addr, serv_len);

	struct sockaddr local_addr;
	Getsockname(clientfd, &local_addr, &serv_len);
	print_ip_addr(family, &local_addr, "local address \n");

	select_do(clientfd);

	Close(clientfd);
	free(serv_addr);
	return 0;
}
Exemplo n.º 2
0
void
ip(struct pktinfo *pktinfo)
{
    register const struct ip *ipv4 = NULL;
    register int ipv4_p = 0;                           /* next header */
    const struct in_addr *ipv4_src = NULL;
    const struct in_addr *ipv4_dst = NULL;
    struct addr_4 addr_ipv4;
    struct udphdr *udphdr = NULL;
    struct tcphdr *tcphdr = NULL;
    struct pktinfo n_hdr;
    u_int32_t src = 0;
    u_int32_t dst = 0;
    char *addr = NULL;
    const u_char *pkt = pktinfo->pkt;
    bpf_u_int32 len = pktinfo->len;

    ipv4 = (const struct ip *)pkt;

    /* next header type code */
    ipv4_p = ipv4->ip_p;

    /* IPv4 address */
    ipv4_src = &ipv4->ip_src;
    ipv4_dst = &ipv4->ip_dst;
    src = htonl(ipv4_src->s_addr);
    dst = htonl(ipv4_dst->s_addr);

    addr_ipv4.src = src;
    addr_ipv4.dst = dst;

    len -= sizeof(struct ip);
    pkt += sizeof(struct ip);

    n_hdr.len = len;
    n_hdr.pkt = pkt;

    addr_ipv4.p_tcp = NULL;
    addr_ipv4.p_udp = NULL;
    addr_ipv4.nxtflag = 0;

    if (ipv4_p == IPPROTO_TCP) {
        tcphdr = (struct tcphdr *)pkt;
        addr_ipv4.p_tcp = tcphdr;
        addr_ipv4.nxtflag = 1;
    }
    else if (ipv4_p == IPPROTO_UDP) {
        udphdr = (struct udphdr *)pkt;
        addr_ipv4.p_udp = udphdr;
        addr_ipv4.nxtflag = 2;
    }

    addr = v4_addr(&addr_ipv4, encap);

    encap ++;

    switch(ipv4_p) {
        case IPPROTO_IPV4 :	/* IP header */
            ip(&n_hdr);
            break;
        case IPPROTO_TCP :	/* tcp */
            if (rflag != 1)
                tcp(&n_hdr);
            break;
        case IPPROTO_UDP :	/* user datagram protocol */
            if (bflag != 1)
                udp(&n_hdr);
            break;
        case IPPROTO_IPV6 :	/* IP6 header */
            ipv6(&n_hdr);
            break;
        default:
    } /* end of switch */
} /* end of ip() */