void DataSink::on_tcpSend_clicked(void) { if (tcpConnection != NULL && ui->tcpSend->isEnabled()) { QByteArray data = ui->tcpText->text().toLocal8Bit(); tcpConnection->write(data.data(), data.length()); tcp_print("SEND: " + ui->tcpText->text()); ui->tcpText->clear(); } }
static void etherframe_print(u_char *usr, const struct pcap_pkthdr *pkt, const u_char *d, uint16_t ethtype) { struct iphdr *ip; struct tcphdr *th; struct udphdr *uh; uint16_t ethtype_le; ethtype_le = ntohs(ethtype); switch (ethtype_le) { case ETH_P_IP: ip = ip_hdr(d); sb_append_str(&sb, "IP: "); iphdr_print(ip, &sb); switch (ip->protocol) { case IPPROTO_TCP: th = tcp_hdr(d + ip_hdrlen(ip)); sb_append_str(&sb, "; TCP: "); tcp_print(th, &sb); break; case IPPROTO_UDP: uh = udp_hdr(d + ip_hdrlen(ip)); sb_append_str(&sb, "; UDP: "); udp_print(uh, &sb); break; default: sb_append_char(&sb, ' '); sb_append_str(&sb, ipproto_str(ip->protocol)); } break; default: /* FIXME: This code is open to buffer overrun errors */ sb_append_str(&sb, "ether type: "); sb.len += sprintf(sb_curr(&sb), "0x%04x ", ethtype_le); sb_append_str(&sb, ethertype_to_str(ethtype_le)); } }
/* * Функция, вызываемая pcap_loop при получении пакета. Производит * форматированный вывод его содержимого. Прототип обязательно такого вида. */ void handler_packet(u_char *args, struct pcap_pkthdr *info, u_char *packet) { short proto; // Инкапсулированный протокол текущего заголовка u_char *header; // Указатель на текущий заголовок u_char *header_prev; // Указатель на предыдущий заголовок u_short chsum; // Контрольная сумма // Выводим симолы для разделения вывода пакетов for (int i = 0; i< 93; i++) printf("="); printf("\n\n"); // Поочередно разворачиваем пакет, смещаясь до следующего заголовка header = packet; proto = ethernet_print((struct hdr_ethernet *)header); header += ethernet_getsize((struct hdr_ethernet *)header); while(proto != 0){ switch (proto){ case TYPE_IP: proto = ip_print((struct hdr_ip *)header); header_prev = header; header += ip_getsize((struct hdr_ip *)header) * 4; break; case TYPE_TCP: proto = tcp_print((struct hdr_tcp *)header); chsum = tcp_checksum(header, header_prev, info->caplen - (int)(header - packet)); printf("calc_chsum: %#x\n", chsum); header += tcp_getsize((struct hdr_tcp *)header); break; default: proto = 0; } } // Выводим оставшиеся данные print_data(header, info->caplen - (int)(header - packet)); printf("\n"); }