Я новичок в Objective C и модифицирую модуль iOS для платформы Titanium, которая отправляет UDP-пакеты. В настоящее время модуль позволяет передать текстовую строку для отправки, и он преобразует ее в байты и отправляет через UDP на IP-адрес и порт назначения. Это прекрасно работает, и вот код:
https://github.com/chrisfjones/titanium_module_udp/blob/master/UDPSocketProxy.m
Что я хочу сделать - это передать байтовый массив в функцию send вместо строки и просто отправить его. Вот код Titanium:
var udp = require('chrisfjones.titanium_module_udp');
var socket = udp.createUDP();
var bytes = [ 100, 15, 132, 53, 14, 246, 0, 0, 0, 0, 196, 209, 1, 1, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 16, 0, 45, 120, 0, 0, 0, 0, 158, 4, 111, 30, 179, 41 ];
socket.send(bytes, "1.2.3.4", 6100);
А вот новая функция отправки:
- (void) sendBytes: (NSArray*) args {
NSArray *msg = (NSArray*)[args objectAtIndex: 0];
NSString *host = [TiUtils stringValue:[args objectAtIndex: 1]];
NSInteger port = [TiUtils intValue: [args objectAtIndex: 2]];
NSLog(@"%@ send bytes: %@ to %@:%i", self, msg, host, port);
struct sockaddr_in destinationAddress;
socklen_t sockaddr_destaddr_len = sizeof(destinationAddress);
memset(&destinationAddress, 0, sockaddr_destaddr_len);
destinationAddress.sin_len = (__uint8_t) sockaddr_destaddr_len;
destinationAddress.sin_family = AF_INET;
destinationAddress.sin_port = htons(port);
destinationAddress.sin_addr.s_addr = inet_addr([host cStringUsingEncoding: NSUTF8StringEncoding]);
NSData *destinationAddressData = [NSData dataWithBytes:&destinationAddress length:sizeof(destinationAddress)];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:msg];
CFSocketError socket_error = CFSocketSendData(_socket, (CFDataRef) destinationAddressData, (CFDataRef) data, 10);
if (socket_error) {
NSLog(@"socket error: %li", socket_error);
} else {
NSLog(@"sent bytes: '%@' to %@:%i", msg, host, port);
}
}
Вы заметите, что он проходит в NSArray. Это потому, что Titanium преобразует созданный мной массив javascript в NSArray объектов NSNumber. Я читал, что это ужасно неэффективно, но он встроен в инфраструктуру Titanium, поэтому я не вижу выхода из этого, поэтому я надеюсь получить ответ о том, как заставить его работать с этим, а не лекцию о том, как это сделать. это неэффективно.
Когда я вызываю новый метод send, вместо того, чтобы отправлять около 50 байтов, которые я передаю, я вижу в wireshark, что он на самом деле передает более 1000 байтов. Я предполагаю, что проблема с преобразованием в этой строке:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:msg];
Может кто-нибудь помочь с тем, как просто отправить байтовый массив, который я передаю? Спасибо!