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; }
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() */