UDP-сокет iOS "sendto" не может отправить сразу по одному - PullRequest
0 голосов
/ 13 мая 2019

Я обнаружил, что поведение интерфейса sendto в сокете iOS отличается от ядра Android или Linux. Когда мы вызываем sendto, мы одновременно начинаем захват Wireshark. Но мы не можем сразу найти данные захвата. Мы проверяем, что мы непрерывно отправляем 332 байта с помощью «sendto» за интервал 40 мс. И мы обнаружили, что все пакеты данных отправлялись в сеть за короткое центральное время вместо интервалов 40 мс (или выше). Мы сомневаемся, что ios kernal внес некоторые изменения в udp. Также он может вызывать задержку звука около 900-1000 мс.

У меня есть тест в iphone 5s и iphone 6, iOS 10 или 11 по демоверсии, используй "sendto" api

#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <sys/types.h>

int sSock = socket(AF_INET,SOCK_DGRAM,0);


struct sockaddr_in localAddr;
localAddr.sin_family = AF_INET;
    localAddr.sin_port = htons(1001);
    localAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    if(bind(sSock, (struct sockaddr*)&localAddr, sizeof(localAddr)) < 0)
    {
        NSLog(@"bind error");
        return;
    }
    struct sockaddr_in sendAddr;
    sendAddr.sin_family = AF_INET;
    sendAddr.sin_port = htons(21000);
    inet_pton(AF_INET, "114.190.105.220", &sendAddr.sin_addr);
    char sendBuf[332] = {0};


    //unsigned char service_type = 0xe0 | IPTOS_LOWDELAY | IPTOS_RELIABILITY;
    int service_type = 0x10;
    int priority = 6;

    //if(setsockopt(sSock, SOL_SOCKET, SO_PRIORITY, &priority, sizeof(priority))<0)
    if(setsockopt(sSock,IPPROTO_IP,IP_TOS,(void*)(&service_type),sizeof(service_type)) < 0)
    {
        NSLog(@"setsockopt failed1,error[%s]",strerror(errno));
    }
   while(true)
   {
       sendto(sSock, sendBuf, sizeof(sendBuf), 0, (struct sockaddr*)&sendAddr, sizeof(sendAddr));
       time_t timeNow;
       time(&timeNow);
       struct tm tmNow;
       struct timeval tvNow;
       localtime_r(&timeNow,&tmNow);
       gettimeofday(&tvNow, NULL);
       char sTime[256] = {0};
       snprintf(sTime, sizeof(sTime)-1, "%04d%02d%02d %02d%02d%02d.%d",tmNow.tm_year+1900,tmNow.tm_mon,tmNow.tm_mday,tmNow.tm_hour,tmNow.tm_min,tmNow.tm_sec,tvNow.tv_usec/1000);
       NSLog(@"[%s]interval 40ms send",sTime);
       usleep(40*1000);
   }

все пакеты данных были отправлены в сеть за короткое центральное время вместо интервалов 40 мс (или выше). все пакеты отправляются одновременно, Wireshark перехватывает как это:

Нет. Протокол времени

819 41,439392 H264

820 41,439617 H264

821 41,439819 H264

...