iPhone上的networking活动监控

我已经工作了5天,试图学习和实施iPhone上的networking监视器。 我看着苹果公司的netstat代码,而且我的头发损失了25%。

我findJB设备的链接,但我需要它在非JB设备上执行。 (无论苹果是否在App Store上接受)。

我发现了一些有用的链接:

如何获得tcp udp在iPhone上打开端口列表 (我无法parsing在这个问题中返回的数据:()

iPhone上的数据使用情况

sysctlbyname buf返回types (我不是一个networking人..不能理解这一个,可能是你们可以帮助:))

TCP / UPD端口列表

我可以说我从第一个链接得到了一些东西。 你们能帮我parsing数据吗? 有没有其他的方法来实现这个?

好吧,你在桌子上有你需要的一切。

你可以检查的问题是否有任何私人API来监视iPhone上的networkingstream量? 在这里你可以findinet的源代码 。 该代码有你需要parsing返回的数据如何获得tcp udp在iPhone上打开端口列表

size_t len = 0; if (sysctlbyname("net.inet.tcp.pcblist_n", 0, &len, 0, 0) < 0) { perror("sysctlbyname"); } else { char *buf = malloc(len); sysctlbyname("net.inet.tcp.pcblist_n", buf, &len, 0, 0); NSData *data = [NSData dataWithBytesNoCopy:buf length:len]; NSLog(@"data = %@", data); } 

好的,是的inet的源代码有点复杂。 但是,你知道netstat打印净状态。 所以,你只需要看看在什么时候执行printf,此时你将会parsing数据。

如果您尝试编译IOS的源代码,您会发现很多问题:某些头文件不在ios sdk中。 好吧,没有问题复制标题。

对于模拟器,您只需要复制netstat.h的头文件。 并添加一些私有的结构声明:

 struct xtcpcb_n { u_int32_t xt_len; u_int32_t xt_kind; /* XSO_TCPCB */ u_int64_t t_segq; int t_dupacks; /* consecutive dup acks recd */ int t_timer[TCPT_NTIMERS_EXT]; /* tcp timers */ int t_state; /* state of this connection */ u_int t_flags; int t_force; /* 1 if forcing out a byte */ tcp_seq snd_una; /* send unacknowledged */ tcp_seq snd_max; /* highest sequence number sent; * used to recognize retransmits */ tcp_seq snd_nxt; /* send next */ tcp_seq snd_up; /* send urgent pointer */ tcp_seq snd_wl1; /* window update seg seq number */ tcp_seq snd_wl2; /* window update seg ack number */ tcp_seq iss; /* initial send sequence number */ tcp_seq irs; /* initial receive sequence number */ tcp_seq rcv_nxt; /* receive next */ tcp_seq rcv_adv; /* advertised window */ u_int32_t rcv_wnd; /* receive window */ tcp_seq rcv_up; /* receive urgent pointer */ u_int32_t snd_wnd; /* send window */ u_int32_t snd_cwnd; /* congestion-controlled window */ u_int32_t snd_ssthresh; /* snd_cwnd size threshold for * for slow start exponential to * linear switch */ u_int t_maxopd; /* mss plus options */ u_int32_t t_rcvtime; /* time at which a packet was received */ u_int32_t t_starttime; /* time connection was established */ int t_rtttime; /* round trip time */ tcp_seq t_rtseq; /* sequence number being timed */ int t_rxtcur; /* current retransmit value (ticks) */ u_int t_maxseg; /* maximum segment size */ int t_srtt; /* smoothed round-trip time */ int t_rttvar; /* variance in round-trip time */ int t_rxtshift; /* log(2) of rexmt exp. backoff */ u_int t_rttmin; /* minimum rtt allowed */ u_int32_t t_rttupdated; /* number of times rtt sampled */ u_int32_t max_sndwnd; /* largest window peer has offered */ int t_softerror; /* possible error not yet reported */ /* out-of-band data */ char t_oobflags; /* have some */ char t_iobc; /* input character */ /* RFC 1323 variables */ u_char snd_scale; /* window scaling for send window */ u_char rcv_scale; /* window scaling for recv window */ u_char request_r_scale; /* pending window scaling */ u_char requested_s_scale; u_int32_t ts_recent; /* timestamp echo data */ u_int32_t ts_recent_age; /* when last updated */ tcp_seq last_ack_sent; /* RFC 1644 variables */ tcp_cc cc_send; /* send connection count */ tcp_cc cc_recv; /* receive connection count */ tcp_seq snd_recover; /* for use in fast recovery */ /* experimental */ u_int32_t snd_cwnd_prev; /* cwnd prior to retransmit */ u_int32_t snd_ssthresh_prev; /* ssthresh prior to retransmit */ u_int32_t t_badrxtwin; /* window for retransmit recovery */ }; struct xinpcb_n { u_int32_t xi_len; /* length of this structure */ u_int32_t xi_kind; /* XSO_INPCB */ u_int64_t xi_inpp; u_short inp_fport; /* foreign port */ u_short inp_lport; /* local port */ u_int64_t inp_ppcb; /* pointer to per-protocol pcb */ inp_gen_t inp_gencnt; /* generation count of this instance */ int inp_flags; /* generic IP/datagram flags */ u_int32_t inp_flow; u_char inp_vflag; u_char inp_ip_ttl; /* time to live */ u_char inp_ip_p; /* protocol */ union { /* foreign host table entry */ struct in_addr_4in6 inp46_foreign; struct in6_addr inp6_foreign; } inp_dependfaddr; union { /* local host table entry */ struct in_addr_4in6 inp46_local; struct in6_addr inp6_local; } inp_dependladdr; struct { u_char inp4_ip_tos; /* type of service */ } inp_depend4; struct { u_int8_t inp6_hlim; int inp6_cksum; u_short inp6_ifindex; short inp6_hops; } inp_depend6; u_int32_t inp_flowhash; }; #define SO_TC_STATS_MAX 4 struct data_stats { u_int64_t rxpackets; u_int64_t rxbytes; u_int64_t txpackets; u_int64_t txbytes; }; struct xgen_n { u_int32_t xgn_len; /* length of this structure */ u_int32_t xgn_kind; /* number of PCBs at this time */ }; #define XSO_SOCKET 0x001 #define XSO_RCVBUF 0x002 #define XSO_SNDBUF 0x004 #define XSO_STATS 0x008 #define XSO_INPCB 0x010 #define XSO_TCPCB 0x020 struct xsocket_n { u_int32_t xso_len; /* length of this structure */ u_int32_t xso_kind; /* XSO_SOCKET */ u_int64_t xso_so; /* makes a convenient handle */ short so_type; u_int32_t so_options; short so_linger; short so_state; u_int64_t so_pcb; /* another convenient handle */ int xso_protocol; int xso_family; short so_qlen; short so_incqlen; short so_qlimit; short so_timeo; u_short so_error; pid_t so_pgid; u_int32_t so_oobmark; uid_t so_uid; /* XXX */ }; struct xsockbuf_n { u_int32_t xsb_len; /* length of this structure */ u_int32_t xsb_kind; /* XSO_RCVBUF or XSO_SNDBUF */ u_int32_t sb_cc; u_int32_t sb_hiwat; u_int32_t sb_mbcnt; u_int32_t sb_mbmax; int32_t sb_lowat; short sb_flags; short sb_timeo; }; struct xsockstat_n { u_int32_t xst_len; /* length of this structure */ u_int32_t xst_kind; /* XSO_STATS */ struct data_stats xst_tc_stats[SO_TC_STATS_MAX]; }; 

但是,对于设备,你需要复制一些其他的内核头,我不知道为什么头不在设备的SDK(也许如果你使用它们,苹果公司不会批准你的应用程序,我不知道,但这并不重要)。

您可以将模拟器SDK中缺失的标题复制到您的项目中。 或者,您可以将头文件path更改为模拟器SDK。 (我复制了标题)。
如果您复制标题,您将需要更改一些包含声明。

你不需要所有的inet.c代码。 你只需要这些function:

  • protopr
  • inetprint
  • inetname

然后在这些函数里面,你将会看到带有parsing数据的printf,你可以把它添加到字典中。

这是我的代码。 你可以看到一个名为DHInet的类, 有两个方法,它们返回一个带有NSDictionary列表和连接信息的NSArray。

我希望你觉得它很有用,如果有人想要帮我改进代码,那就这样吧,我需要清理代码,因为它有很多ifdef是没有必要的。