nw_connection_send 将数据包发送到 Android

Posted

技术标签:

【中文标题】nw_connection_send 将数据包发送到 Android【英文标题】:nw_connection_send packets data to Android 【发布时间】:2021-08-14 01:41:12 【问题描述】:

我正在尝试将数据包数据从 macOS 发送到 android,我将数据包定义为 int(dataType)|int(packet len)|data

说 dataType 值 5 代表一个从 macOS 方面:

auto sendString = [](nw_connection_t connect, dispatch_queue_t q1, int dtType, std::string &data)

   int len = (int)data.length()
   int header[2] = dtType, (int)(len * sizeof(char)); //dtType=5
   auto dat_head = dispatch_data_create(&header[0], 2 * sizeof(int), q1, ^);
   auto dat_str = dispatch_data_create(info.c_str(), sizeof(char) * len, q1, ^);
   auto packet = dispatch_data_create_concat(dat_head, dat_str);
   nw_connection_send(connect, 
                      packet, 
                      NW_CONNECTION_DEFAULT_MESSAGE_CONTEXT, 
                      true, ^(nw_error_t  _Nullable error) 
        
            if (error != NULL) 
                errno = nw_error_get_error_code(error);
                LOGEX(LOG_ERR, "error code:%d: [%s]", errno, strerror(errno));
            
            else 
                LOGEX(LOG_INFO, "data sent out");
            
        );

在Android(Java)端,我使用readInt来获取数据包数据类型

int dataType = input.readInt();

我得到的数据类型是 16777216,而不是 5,我检查了字节顺序,它不能解决问题。 如何在macOS端格式化数据,让Android读取正确的int?

【问题讨论】:

【参考方案1】:

我放弃发送原始数据,使用 NSString 将标头格式化为 UTF8 字符串,在 Android 端解析字符串并按预期工作

 NSString *dataHead = [NSString stringWithFormat:@"MTData type:%d,len:%d,\n", (int)dt, len];
 NSMutableData *data = [NSMutableData dataWithData:[dataHead dataUsingEncoding:NSUTF8StringEncoding]];
                    
[data appendBytes:info.c_str() length:info.length()];
auto dispatch_content = dispatchDataFromNSData(data);

【讨论】:

以上是关于nw_connection_send 将数据包发送到 Android的主要内容,如果未能解决你的问题,请参考以下文章

如何将TCP数据包发送到iPhone而不是ICMP数据包

将原始数据包发送到 Android 中的 NetworkInterface 不起作用?

使用 nodejs 将直播数据包发送到 youtube?

我将如何在 Javascript 中通过 WebSocket 发送和接收数据包

WSASend 是不是将所有 WSABUF 缓冲区作为单个数据包发送?

通过gopcap将数据包发送到127.0.0.1