为什么TCP socket.connect调用仅在4g网络中的ios13上失败?

问题描述

我们只需要简单的套接字打开/连接/ GET即可下载ios应用程序的文件。 在几乎所有情况下,这都可以正常工作。除了在4G网络上运行iOS13的设备上。

以下组合都可以:

  • ios12,无线网络
  • ios12,3g
  • ios12,4克
  • iOS13,无线网络
  • iOS13,3克

但是当为iOS13、4g执行socket.connect()时,它只是失败了。 (简化的)代码是:

function Header({ backButton }) {
  const histroy = useHistory();

  return (
    <div className="header">
      ...
    </div>
  );
}

对于任何正确的网络,我都可以正确通过connect调用,并且日志类似于:

#include <sys/socket.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <netinet/tcp.h>

static void setsockaddr4( sockaddr_in *sa,String host,int port ){
    memset( sa,sizeof(*sa) );
    sa->sin_family=AF_INET;
    sa->sin_port=htons( port );
    
    if( host.Length() && host.Length()<1024 ){
        
        // copy to char*
        char buf[1024];
        for( int i=0;i<host.Length();++i ) buf[i]=host[i];
        buf[host.Length()]=0;

        NSLog(@" BBSocket::setsockaddr4: hostBuff[%s]",buf);
        if( hostent *host=gethostbyname( buf ) )
        {
            if( char *hostip=inet_ntoa(*(in_addr *)*host->h_addr_list) ){
                sa->sin_addr.s_addr=inet_addr( hostip );
                NSLog(@" BBSocket::setsockaddr4: sin_addr [%s]",hostip);
            }
        }
    }
}

// ..
int _sock;
_sock=socket( AF_INET,SOCK_STREAM,IPPROTO_TCP ); 

sockaddr_in sa;
setsockaddr4( &sa,host,port );
printsockaddr4(&sa);
bool ret = connect( _sock,(sockaddr*)&sa,sizeof(sa) )>=0;
if(ret == false)
    {
        NSLog(@" BBSocket::Connect4. Error: %i",errno);
    }
    else
    {
        NSLog(@" BBSocket::Connect4. Success");
    }

然而,仅针对上述4g选项的套接字连接失败,并出现错误51:

BBSocket::Open. proto: 1
BBSocket::Open. Socket open OK
BBSocket::setsockaddr4
BBSocket::setsockaddr4: hostBuff[s3.dualstack.eu-west-2.amazonaws.com]
BBSocket::setsockaddr4: sin_addr [52.95.148.124]
BBSocket::printsockaddr4: START -=================-
==- sin_family [2] :: AF_INET[2]  AF_INET6[30]
==- sin_port [80] :: netwOrder[20480]
==- sin_addr [52.95.148.124] :: netwOrder[2090098484]
BBSocket::Connect4. Success

所有IP地址都是正确的,只是连接失败并显示

BBSocket::Open. proto: 1
BBSocket::Open. Socket open END OK
BBSocket::setsockaddr4
BBSocket::setsockaddr4: hostBuff[s3.dualstack.eu-west-2.amazonaws.com]
BBSocket::setsockaddr4: sin_addr [52.95.149.16]
BBSocket::printsockaddr4: START -=================-
==- sin_family [2] :: AF_INET[2]  AF_INET6[30]
==- sin_port [80] :: netwOrder[20480]
==- sin_addr [52.95.149.16] :: netwOrder[278224692]
BBSocket::Connect4. Error: 51

对于可能导致这种情况的任何见解, 谢谢Jaime

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)