2013-11-14 108 views
16

我一直在努力工作5天,试图在iPhone上学习和实施网络监视器。 我看着苹果公司的netstat代码,并且我失去了25%的头发。iPhone上的网络活动监测

我发现JB设备的链接,但我需要它在非JB设备上执行。 (不管苹果是否在App Store上接受它)。

我发现一些有用的链接:

how to get tcp udp opening port list on iPhone(我无法分析这个问题:(返回的数据)

Data Usage on iPhone

sysctlbyname buf return type(我不是一个网络的家伙..不明白这一块,可能是你们能帮助:))

TCP/UPD port list

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

+0

所以基本上你想通过你的iPhone看到你的网络上发生了什么。 – Antp

+0

你想解析帖子的回应如何获得tcp udp在iPhone上打开端口列表吗? http://stackoverflow.com/questions/8176839/how-to-get-tcp-udp-opening-port-list-on-iphone-by-objective-c?rq=1 而且不管它是否接受由苹果? – dcorbatta

+0

@dcorbatta - 是的,我可以忍受那个.. coz我不会在appstore上传它。 – Hisenberg

回答

10

好的,你有所有你需要的桌子。

您可以检查问题Is there any private api to monitor network traffic on iPhone? 在这里您可以找到源code of inet。这些代码都需要分析数据返回的how to get tcp udp opening port list on 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打印净状态。所以,你只需要看看inet何时执行printf,此时你将会解析数据。

如果您尝试编译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中缺失的标题复制到您的项目中。或者您可以将头文件路径更改为模拟器SDK。 (我复制了标题)。
如果您复制标题,您将需要更改一些包含声明。

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

  • protopr
  • inetprint
  • inetname

然后这些功能里面,你会看到解析,您可以添加在字典中的数据中的printf。

Here是我的代码。您可以看到一个名为DHInet的类,该类使用两种方法将包含NSDictionary列表的NSArray与连接的信息一起返回。

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

+0

好友你的样品看起来很神奇......我唯一缺少的地方是国外地址不完整..我可以得到完整的网址吗? – Hisenberg

+0

嗯,printf是否显示完整的URL? – dcorbatta

+0

no ... m geting something .. 'key:Foreign Address,value:maa03s17-in-f31..https' – Hisenberg