Не все пакеты, отправленные udp на localhost, отображаются на wireshark - PullRequest
0 голосов
/ 23 февраля 2020

Я пишу простой генератор udp traffi c, использующий C ++ и PracticalSocket в качестве оболочки оболочки (http://cs.ecs.baylor.edu/~donahoo/practical/CSockets/practical/), и использую Wireshark для проверки вывода. Проблема в том, что все пакеты отправляются без ошибок, но я не получил все пакеты на Wireshark. Пример: я отправил 10000 пакетов без ошибок, но Wireshark отображает только 9876 пакетов. Это код отправителя:

#include <iostream>
#include "PracticalSocket.h"
#include <thread>
using namespace std;
const int PAYLOAD_SIZE = 1464;

int main(int argc, char *argv[])
{
    char txBuffer[PAYLOAD_SIZE];
    string destAddress = argv[1];
    unsigned short destPort =  atoi(argv[2]);
    unsigned long numOfPackets =  atoi(argv[3]);
    UDPSocket tx_sock;
    unsigned long int i;
    printf("START\n");
    int ret;
    unsigned long int errors=0;
    for(i=0;i<numOfPackets;i++)
    {
        ret=tx_sock.sendTo(txBuffer, PAYLOAD_SIZE, destAddress, destPort);
        if(ret<=0) {
            errors++;
            printf("ERROR\n");
        }

    }
    printf("END - packets(%d) errors(%d)\n",i,errors);
    return i;
}

Вход и выход в терминале:

udpGen 127.0.0.1 1234 10000

START

END - пакеты (10000) ошибки (0)

Затем я написал утилиту получателя, чтобы проверить, является ли проблема WS.

#include "PracticalSocket.h"

using namespace std;
const int BUFFERSIZE = 1500;

int main(int argc, char *argv[])
{

    unsigned short rxLocalPort = atoi(argv[1]);
    unsigned long int maxCounter = atoi(argv[2]);;
    UDPSocket rx_sock(rxLocalPort);
    char echoBuffer[BUFFERSIZE];         // Buffer for echo string
    int recvMsgSize;                  // Size of received message
    string sourceAddress;             // Address of datagram source
    unsigned short sourcePort;        // Port of datagram source
    unsigned long int counter = 0;
    printf("rx from port %d\n",rxLocalPort);
    bool go=true;
    while(go)
    {
        recvMsgSize = rx_sock.recvFrom(echoBuffer, BUFFERSIZE, sourceAddress, sourcePort);
        counter++;
        if(counter>=maxCounter){
            go=false;
        }
    }
    printf("received %d packets\n",counter);
    return 0;
}

Из командной строки я передал 1234 как destPort и 10000 как numOfPackets. Приложение не закрывалось в то время как l oop и поэтому ничего не печатало. Он возвращает, только если я передаю большее значение пакетов приложению-отправителю (т. Е. 11000).

Затем я попытался также увеличить буферы tx и rx с обеих сторон, но без последствий. Для этого я добавил функцию-член в класс UDPSocket:

void UDPSocket::setbufferSize(int sndbuf, int rcvbuf) {
    int s = sndbuf;
    int r = rcvbuf;
    setsockopt(sockDesc, SOL_SOCKET, SO_SNDBUF, (raw_type *)&s, sizeof(s));
    setsockopt(sockDesc, SOL_SOCKET, SO_RCVBUF, (raw_type *)&r, sizeof(r));
}
...