static VALUE rb_sigar_net_stat_get(VALUE obj, VALUE flags, VALUE bytes, int port) { int status; int has_port = (port != -1); sigar_t *sigar = rb_sigar_get(obj); sigar_net_stat_t *RETVAL = malloc(sizeof(*RETVAL)); sigar_net_address_t address; if (has_port) { status = rb_sigar_str2net_address(bytes, &address); if (status == SIGAR_OK) { status = sigar_net_stat_port_get(sigar, RETVAL, NUM2INT(flags), &address, port); } } else { status = sigar_net_stat_get(sigar, RETVAL, NUM2INT(flags)); } if (status != SIGAR_OK) { free(RETVAL); RB_SIGAR_CROAK; } return Data_Wrap_Struct(rb_cSigarNetStat, 0, rb_sigar_free, RETVAL); }
JNIEXPORT void SIGAR_JNI(NetStat_stat) (JNIEnv *env, jobject obj, jobject sigar_obj, jint flags, jbyteArray jaddress, jlong port) { int status; sigar_net_stat_t netstat; jclass cls; jfieldID id; jintArray states; jint tcp_states[SIGAR_TCP_UNKNOWN]; sigar_net_address_t address; jboolean has_port = (port != -1); dSIGAR_VOID; if (has_port) { status = jbyteArray_to_sigar_net_address(env, jaddress, &address); if (status == SIGAR_OK) { status = sigar_net_stat_port_get(sigar, &netstat, flags, &address, port); } } else { status = sigar_net_stat_get(sigar, &netstat, flags); } if (status != SIGAR_OK) { sigar_throw_error(env, jsigar, status); return; } cls = JENV->GetObjectClass(env, obj); JAVA_SIGAR_INIT_FIELDS_NETSTAT(cls); JAVA_SIGAR_SET_FIELDS_NETSTAT(cls, obj, netstat); if (sizeof(tcp_states[0]) == sizeof(netstat.tcp_states[0])) { memcpy(&tcp_states[0], &netstat.tcp_states[0], sizeof(netstat.tcp_states)); } else { int i; for (i=0; i<SIGAR_TCP_UNKNOWN; i++) { tcp_states[i] = netstat.tcp_states[i]; } } states = JENV->NewIntArray(env, SIGAR_TCP_UNKNOWN); if (JENV->ExceptionCheck(env)) { return; } JENV->SetIntArrayRegion(env, states, 0, SIGAR_TCP_UNKNOWN, tcp_states); id = JENV->GetFieldID(env, cls, "tcpStates", "[I"); JENV->SetObjectField(env, obj, id, states); }
NetStat::NetStat(QString ifname) { int status; QString tmp; sigar_t *sigar; sigar_net_stat_t s; sigar_net_interface_stat_t curr, curr2; sigar_open(&sigar); status = sigar_net_stat_get(sigar, &s, DEFAULT_NET_STAT_FLAGS); if (status != SIGAR_OK) { printf("get net start info error: %d (%s)\n", status, sigar_strerror(sigar, status)); exit(1); } /* s.all_inbound_total; s.all_outbound_total; s.tcp_inbound_total; s.tcp_outbound_total; s.tcp_states;*/ tcp_established = s.tcp_states[SIGAR_TCP_ESTABLISHED]; tcp_listen = s.tcp_states[SIGAR_TCP_LISTEN]; tcp_time_wait = s.tcp_states[SIGAR_TCP_TIME_WAIT]; tcp_close_wait = s.tcp_states[SIGAR_TCP_CLOSE_WAIT]; tcp_idle = s.tcp_states[SIGAR_TCP_IDLE]; status = sigar_net_interface_stat_get(sigar, ifname.toAscii(), &curr); if (status != SIGAR_OK) { printf("get stat net info error: %d (%s)\n", status, sigar_strerror(sigar, status)); exit(1); } // printf("curr_net_stat: rx_bytes=%llu, tx_bytes=%llu \n", (Llu)curr.rx_bytes, (Llu)curr.tx_bytes); m_time.start(); //poll(0, 0, DEFAULT_PAUSE); QTest::qSleep(1000); status = sigar_net_interface_stat_get(sigar, ifname.toAscii(), &curr2); if (status != SIGAR_OK) { printf("get stat net info error: %d (%s)\n", status, sigar_strerror(sigar, status)); exit(1); } int elapsed = m_time.elapsed(); //rx_bytes.setNum(curr.rx_bytes, 10); //tx_bytes.setNum(curr.tx_bytes, 10); //double tmp = (curr2.rx_bytes - curr.rx_bytes) / KiB; //qDebug() << "rx tmp " << tmp; rx_rate.setNum(((curr2.rx_bytes - curr.rx_bytes) / KiB), 'g'); //rx_rate = (curr2.rx_bytes - curr.rx_bytes) / KiB; //tmp = ""; //tmp = (curr2.tx_bytes - curr.tx_bytes) / KiB; //qDebug() << "tx tmp " << tmp; tx_rate.setNum(((curr2.tx_bytes - curr.tx_bytes) / KiB), 'g'); //tx_rate = (curr2.tx_bytes - curr.tx_bytes) / KiB; //tmp = ""; qDebug() << "tx2 rate : " << curr2.tx_bytes << " tx rate : " << curr.tx_bytes << " rate : " << (curr2.tx_bytes - curr.tx_bytes) / KiB; sigar_close(sigar); }