我发现iOS套接字“ sendto”界面的行为不同于android或linux内核。当我们称为“ sendto”时,我们同时开始进行wireshark捕获。但是我们无法立即找到捕获数据。我们进行了一项测试,以每40ms间隔连续发送“ sendto” 332字节。结果发现,所有数据包都是在较短的中央时间而不是40MS(或更高)间隔内发送到网络的。我们怀疑ios内核对udp进行了一些更改,也可能会导致音频延迟大约900-1000ms。
我已通过演示版“ sendto” api在iPhone 5s和iPhone 6,iOS 10或11中进行了测试
#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);
}
所有数据包都在短的中心时间内发送到网络,而不是40MS(或更高)的间隔。 所有数据包立即发送,wireshark捕获如下:
不。时间协议
819 41.439392 H264
820 41.439617 H264
821 41.439819 H264