На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > sendto , теряются пакеты до отправки в windows
      Есть примерно такой код (сократил для удобства)

      ExpandedWrap disabled
        SOCKADDR_IN _serv_addr;
        int _mySocket;
        QByteArray packet;
         
        WSADATA wsda;
        if (WSAStartup(0x202, &wsda)) {
            qDebug() << "WSAStartup error: " << WSAGetLastError();
            WSACleanup();
        }
        _mySocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
         
        if (_mySocket == INVALID_SOCKET || _mySocket == SOCKET_ERROR) {
            qDebug() << "create socket error" << endl;
            qDebug() << WSAGetLastError();
            WSACleanup();
        }
         
        _serv_addr.sin_family = AF_INET;
        _serv_addr.sin_port = htons(_settings._port);
        _serv_addr.sin_addr.s_addr = inet_addr(_settings._ip.toAscii().data());
         
        while(true){
               if (sendto(_mySocket, packet.data(), packet.size(), 0, (struct sockaddr*)&_serv_addr, sizeof(sockaddr)) < 0) {
                    qDebug() << "Error" << endl;
            }
         
        }


      При работе на ОС Windows если отлавливать отправляемые с данного хоста пакеты Wireshark`ом пропадает около сотни пакетов. При работе под OC Linux ничего не пропадает. В чем может быть проблема?
      Сообщение отредактировано: wolfdown -
        sendto возвращает при этом SOCKET_ERROR или все успешно? какого размера данные передаются?
          Цитата popsa @
          sendto возвращает при этом SOCKET_ERROR или все успешно? какого размера данные передаются?

          Нет. Ошибок отправки нет.
          Данные отправляются размером 1000 Байт.
            собственно, UDP - протокол без гарантии. Так что потеря пакетов там не то чтобы в порядке вещей, но вполне возможна.
            Для гарантии нужен TCP
              Цитата
              Данные отправляются размером 1000 Байт.

              с размером не пробовал эксперементировать?
              Цитата
              пропадает около сотни пакетов

              это за какое время?
              Цитата
              Для гарантии нужен TCP

              Это да. ТС, по какой причине UDP а не TCP ?)
                Не. UDP может теряться в сети и тд. А у меня даже комп не покинуло (см. схему)
                Прикреплённая картинка
                Прикреплённая картинка

                отправляю 65535 пакетов, соответственно sendto() вызывается столько же раз. На все затрачивается времени - 1 секунда. Wireshrk ловит пакеты на выходе (см. схему) и показывает 65321 или около того, но никогда не 65535.

                С размером тоже эксперементировал. Не помогло(

                Почему UDP? Ну задачу такую поставили генерировать UDP-трафик :)
                Сообщение отредактировано: wolfdown -
                  Цитата wolfdown @
                  int _mySocket;

                  В Винде сокет имеет тип SOCKET
                  А в Линуксе - int
                    Цитата Oleg2004 @
                    Цитата wolfdown @
                    int _mySocket;

                    В Винде сокет имеет тип SOCKET
                    А в Линуксе - int

                    да. но это практически то же самое.

                    ExpandedWrap disabled
                      #define _W64 __w64
                      typedef _W64 unsigned int UINT_PTR, *PUINT_PTR;
                      typedef UINT_PTR        SOCKET;
                      wolfdown
                      Вот совсем не то же самое. В винде сокет - беззнаковый int, с этим связано много ошибок при переносе линуксового кода.
                        Цитата wolfdown @
                        да. но это практически то же самое.

                        Идеология разная.
                        Целое число в *никсах тупо обозначает индекс строки в таблице файлов, в которой расположено описание данного сокета.
                        В винде - 32-битное число - просто уникальный дескриптор этого сокета.
                          Это что сейчас было? :wacko:
                          M
                          Надо сообщать модератору о нарушении в теме :yes: 
                          Сообщение отредактировано: Oleg2004 -
                            Цитата Oleg2004 @
                            Цитата wolfdown @
                            да. но это практически то же самое.

                            Идеология разная.
                            Целое число в *никсах тупо обозначает индекс строки в таблице файлов, в которой расположено описание данного сокета.
                            В винде - 32-битное число - просто уникальный дескриптор этого сокета.

                            Более того, исходя из
                            ExpandedWrap disabled
                              typedef UINT_PTR        SOCKET;

                            следует, что на 64-битной машине, SOCKET будет 64-битным числом.
                            Сообщение отредактировано: GAGARIN -
                              надо данные ловить не ваершарком, а тисипидампом
                              Он пишет сколько пакетов получено, сколько потеряно
                              libpcap физически не может ловить все пакеты 100, часть проходит мимо нее. Это естественно. Потому как ядро живет своей жизнью и его производительность не зависит от производительности промежуточного драйвера libpcap, ядро не будет ждать пока какой-то его компонент будет буферизировать дату. Оно будет передавать, а если драйверу повезет, он может его получить. Короче, суть проблемы в том, что буфер libpcap заполняется, но не освобождается, и пакеты идуть стороной. Особенно это видно под виндой ввиду ее кончености как оси.
                              Но по факту, когда буфер освобождается, для libpcap становится возможным помещать пакеты в свои потроха, и шоу продолжается.
                              Короче, проблема эта не зависит от платформ особо, а бороться с ней можно путем увеличения размера буфера
                              tcpdump --buffer-size=3242304820139489201348201348021
                              на ваершарке, под твоей недоосью, это будет выглядеть так
                              user posted image
                              buffer size
                              Увеличишь до невдолбенных размеров и будет тебе много счастья, хватило бы оперативы )))
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0744 ]   [ 18 queries used ]   [ Generated: 26.12.24, 22:43 GMT ]