我是 Objective C 的新手,我正在修改一个用于发送 UDP 数据包的 Titanium 框架的 iOS 模块。该模块目前允许您传入要发送的文本字符串,并将其转换为字节并通过 UDP 将其发送到目标 ip 和端口。这很好用,这里是代码:
https://github.com/chrisfjones/titanium_module_udp/blob/master/UDPSocketProxy.m
我想要做的是将一个字节数组传递给发送函数而不是一个字符串,然后让它发送。这是钛代码:
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 数组转换为 NSNumber 对象的 NSArray。我读到这是非常低效的,但它内置在 Titanium 框架中,所以我看不到解决方法,所以我希望得到一个关于如何使它与这个传递一起工作的答案,而不是关于如何效率低下。
当我调用新的 send 方法时,它并没有发送我传入的 50 个左右的字节,而是在 Wireshark 中看到它实际上传递了超过 1000 个字节。我假设问题出在这一行的转换上:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:msg];
有人可以帮助我发送我传入的字节数组吗?谢谢!