Я пишу простой генератор 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));
}