Hello. I'll ask you to write a simple program to look at the trep on the blue. Everything's going, but it's not working. Help me.
-
#include <stdio.h>//Пишем как клиент #include <WinSock2.h> #include <conio.h> #define SIO_RCVALL 0x98000001 #define MAX_PACKET_SIZE 0x10000 typedef struct IPHeder { unsigned char version; unsigned char typeserv; unsigned short lenght; unsigned short id; unsigned short flag; unsigned char timelive; unsigned char protocol; unsigned short headersum; unsigned int sourceaddr; unsigned int destaddr; unsigned char data[]; } IPHeader; // Структура для вывода ip заголовка int main() { WSADATA wsd; SOCKET s; HOSTENT* hst; struct sockaddr_in saddr; //SOCKADDR_IN saddr; IN_ADDR iaddr; char name[128]; int err; err = WSAStartup(MAKEWORD(2, 2), &wsd); // Инициализация винсок if (err != 0) { // Проверка инициализации винсок printf("WinSock error\n"); WSAGetLastError(); return 1; } else { printf("WinSock OK\n"); } s = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); // Инициализация сокета if (s == INVALID_SOCKET) { // Проверка сокета printf("Socket error", err); WSAGetLastError(); WSACleanup(); closesocket(s); } else { printf("Socket OK\n"); } err = gethostname(name, sizeof(name)); // Имя машины if (err) { printf("gethostname function failed %d\n", err); WSACleanup(); return 1; } else printf("Host name: %s\n", name); hst = gethostbyname(name); // Адрес машины err = WSAGetLastError(); if (err) { printf("gethostbyname function failed %d\n", err); WSACleanup(); return 1; } //memcpy(&saddr.sin_addr.s_addr, hst->h_addr_list[1], sizeof(saddr.sin_addr.s_addr)); // Имя хоста копируем в saddr ZeroMemory(&saddr, sizeof(saddr)); saddr.sin_family = AF_INET; // Заполняем поля структуры saddr saddr.sin_addr.s_addr = ((struct in_addr*)hst->h_addr_list[1])->s_addr; err = bind(s, (struct sockaddr_in*)&saddr, sizeof(saddr)); // Привязка сокета if (err == SOCKET_ERROR) { // Проверка printf("Bind error\n", err); closesocket(s); WSACleanup(); return 1; } else { printf("Bind OK\n"); } unsigned long flag = 1; char buff[MAX_PACKET_SIZE]; // ioctlsocket(s, SIO_RCVALL, &flag); IPHeader* header; while (1) { err = recv(s, buff, sizeof(buff), 0); if(err == SOCKET_ERROR) { printf("Recv error", err); closesocket(s); WSACleanup(); return 1; } else { header = (IPHeader*)buff; iaddr.s_addr = header->sourceaddr; printf("Source", inet_ntoa(iaddr)); iaddr.s_addr = header->destaddr; printf("Destaddr", inet_ntoa(iaddr)); } } closesocket(s); WSACleanup(); return 0; }
-
I don't see traffic. The mistake doesn't turn out
And why is your program should To see someone else's traffic? :- For this capture of a foreign traffic, three conditions must be met:
The program should be launched with the privileges of the super-user.
Socket's got to open "spawn." There you go.
s = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
A built-in skate has to be allowed to work in a thrill mode. There you go.
ioctlsocket(socket, SIO_RCVALL, "RS_Flag);
In short, I strongly advise you to read this article:
https://habr.com/ru/post/164901/