Сокеты C ++: Включение неразборчивого режима в Windows - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь изменить мою текущую программу сокетирования, чтобы захватывать пакеты в случайном порядке. То, что у меня сейчас есть, способно нормально захватывать пакеты. Я видел другой ответ о том, как сделать это в Linux, но мне нужно найти способ сделать это в Windows.

Вот мой код:

int main(int argc, char const *argv[])
{
    SOCKET s;                       //The bound socket
    struct sockaddr_in server;
    int recv_len;                   //Size of received data
    char udpbuf[BUFLEN];            //A buffer for the incoming data.
    float data;                     //The data in the packet

//Create a socket
if ((s = socket(AF_INET, SOCK_RAW, 0)) == INVALID_SOCKET)
{
    printf("Could not create socket : %d", WSAGetLastError());
}
printf("Socket created.\n");

//Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr(ADDR);
server.sin_port = htons(PORT);

//Bind socket to address
if (bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
{
    printf("Bind failed with error code : %d", WSAGetLastError());
    exit(EXIT_FAILURE);
}
puts("Bind done\n");

while (true)
{
    //Block statment. Code will wait until it detect packets.
    if ((recv_len = recvfrom(s, udpbuf, BUFLEN, 0, 0, 0)) == SOCKET_ERROR)
    {
        printf("recvfrom() failed with error code : %d", WSAGetLastError());
        exit(EXIT_FAILURE);
    }

return 0;
}

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Чтобы перевести сокет в беспорядочный режим в Windows, вам нужно вызвать WSAIoCtl(), чтобы выдать SIO_RCVALL контрольный код для сокета.

int main(int argc, char const *argv[])
{
    WSADATA wsa;
    SOCKET s;                       //The bound socket
    struct sockaddr_in server;
    int recv_len;                   //Size of received data
    char udpbuf[BUFLEN];            //A buffer for the incoming data.

    //Initialize Winsock
    int err = WSAStartup(MAKEWORD(2,0), &wsa);
    if (err != 0)
    {
        printf("Could not initialize Winsock : %d", err);
        exit(EXIT_FAILURE);
    }

    //Create a socket
    if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_IP)) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d", WSAGetLastError());
        WSACleanup();
        exit(EXIT_FAILURE);
    }
    printf("Socket created.\n");

    //Prepare the sockaddr_in structure
    memset(&server, 0, sizeof(server));
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = inet_addr(ADDR);
    server.sin_port = htons(PORT);

    //Bind socket to address
    if (bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
    {
        printf("Bind failed with error code : %d", WSAGetLastError());
        closesocket(s);
        WSACleanup();
        exit(EXIT_FAILURE);
    }
    puts("Bind done\n");

    // enable promiscuous mode
    DWORD dwValue = RCVALL_ON;
    DWORD dwBytesReturned = 0;
    if (WSAIoctl(s, SIO_RCVALL, &dwValue, sizeof(dwValue), NULL, 0, &dwBytesReturned, NULL, NULL) == SOCKET_ERROR)
    {
        printf("Ioctl failed with error code : %d", WSAGetLastError());
        closesocket(s);
        WSACleanup();
        exit(EXIT_FAILURE);
    }
    puts("Ioctl done\n");

    while (true)
    {
        //Block statment. Code will wait until it detect packets.
        if ((recv_len = recvfrom(s, udpbuf, BUFLEN, 0, 0, 0)) == SOCKET_ERROR)
        {
            printf("recvfrom() failed with error code : %d", WSAGetLastError());
            closesocket(s);
            WSACleanup();
            exit(EXIT_FAILURE);
        }
    }

    closesocket(s);
    WSACleanup();

    return 0;
}

В качестве альтернативы у Microsoft также есть отдельный API сетевого монитора , который позволяет вам контролировать и захватывать сетевой трафик без использования Winsock вообще.

0 голосов
/ 05 ноября 2018

Я бы порекомендовал вам использовать библиотеку winpcap. Смотрите www.winpcap.org. У них есть исчерпывающая документация и примеры того, как это сделать: https://www.winpcap.org/docs/docs_412/html/group__wpcap__tut3.html

например. Wireshark использует winpcap для Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...