Моя задача - создать простой TCP-сканер, который использует необработанные сокеты.Я нашел веб-страницу, содержащую нужный мне код.Создание и запуск кода не проблема, кажется, все работает нормально.Когда я пытаюсь отследить посылку в Wireshark, ее там нет.Я просматриваю все интерфейсы, смотрю на любые, даже пробовал фильтровать результаты, но безрезультатно.Моя цель - отправить пакет из моего интерфейса без петель (147.229.206.115) на www.google.com (172.217.23.196) через порт 20, чтобы определить, открыт ли он, закрыт или отфильтрован.Код содержит пользовательский заголовок для ip, а также tcp, потому что мы должны установить вручную:
struct ipheader {
unsigned char iph_ihl:5, /* Little-endian */
iph_ver:4;
unsigned char iph_tos;
unsigned short int iph_len;
unsigned short int iph_ident;
unsigned char iph_flags;
unsigned short int iph_offset;
unsigned char iph_ttl;
unsigned char iph_protocol;
unsigned short int iph_chksum;
unsigned int iph_sourceip;
unsigned int iph_destip;
};
struct tcpheader {
unsigned short int tcph_srcport;
unsigned short int tcph_destport;
unsigned int tcph_seqnum;
unsigned int tcph_acknum;
unsigned char tcph_reserved:4, tcph_offset:4;
unsigned int
tcp_res1:4, /*little-endian*/
tcph_hlen:4, /*length of tcp header in 32-bit words*/
tcph_fin:1, /*Finish flag "fin"*/
tcph_syn:1, /*Synchronize sequence numbers to start a connection*/
tcph_rst:1, /*Reset flag */
tcph_psh:1, /*Push, sends data to the application*/
tcph_ack:1, /*acknowledge*/
tcph_urg:1, /*urgent pointer*/
tcph_res2:2;
unsigned short int tcph_win;
unsigned short int tcph_chksum;
unsigned short int tcph_urgptr;
};
int raw_socket;
// creating the raw socket
raw_socket = socket(PF_INET, SOCK_RAW, IPPROTO_TCP);
if(raw_socket < 0){
fprintf(stderr, "Failed to create the socket\n");
exit(INTERNAL_ERROR);
}
// datagram to represent the packet
char datagram[4096];
// we need to map it so the datagram can represent it
struct ipheader* iph = (struct ipheader*) datagram;
struct tcpheader* tcph = (struct tcpheader*) datagram + sizeof(ipheader);
struct sockaddr_in sin;
// set the source parameters
sin.sin_family = AF_INET;
sin.sin_port = htons(order_num); // destination port num
sin.sin_addr.s_addr = inet_addr("172.217.23.196"); // destination ip
// zero out the buffer
memset(datagram, 0, 4096);
// filling in the ip header
iph->iph_ihl = 5;
iph->iph_ver = 4;
iph->iph_tos = 0;
iph->iph_len = sizeof(struct ipheader) + sizeof(struct tcpheader);
iph->iph_ident = htonl(54321); // this dosn't matter
iph->iph_offset = 0;
iph->iph_ttl = 255;
iph->iph_protocol = 6;
iph->iph_chksum = 0;
// setting the source and destination
iph->iph_sourceip = inet_addr("147.229.206.115");
iph->iph_destip = sin.sin_addr.s_addr;
// setting the tcph header
tcph->tcph_srcport = htons(5678);
tcph->tcph_destport = htons(20);
tcph->tcph_seqnum = random();
tcph->tcph_acknum = 0;
tcph->tcph_res2 = 0;
tcph->tcph_offset = 0;
tcph->tcph_syn = TH_FIN;
tcph->tcph_win = htonl(65535);
tcph->tcph_chksum = 0;
tcph->tcph_urgptr = 0;
// calculate the checksum
iph->iph_chksum = 0;//csum((unsigned short *) datagram, iph->iph_len >> 1);
// we need to tell kernel that headers are included in the packet
int one = 1;
const int *val = &one;
if(setsockopt(raw_socket, IPPROTO_IP, IP_HDRINCL, val, sizeof(one)) < 0){
fprintf(stderr, "Error setting IP_HDRINCL %d\n", errno);
exit(INTERNAL_ERROR);
}
// sending the packet
if(sendto(raw_socket, datagram, iph->iph_len, 0, (struct sockaddr *) &sin, sizeof(sin)) < 0){
fprintf(stderr, "Error while sending %d\n", errno);
exit(INTERNAL_ERROR);
}
// close the raw socket
close(raw_socket);
Мой вопрос: как мне узнать, был ли послан пакет, если я не вижу его в Wireshark?Что я делаю не так?