2014-09-13 2 views
1

Я использую библиотеку CocoaAsyncSocket в моем приложении iOS на основе Swift. Я создал асинхронный UDP-сокет для UDP-сервера в своей сети, и он отправляет ответ.Извлечение строки из сообщения UDP-сервера

Я читаю этот ответ так:

func udpSocket(sock: GCDAsyncUdpSocket!, didReceiveData data: NSData!, fromAddress address: NSData!, withFilterContext filterContext: AnyObject!) { 
    println("didReceiveData") 
    let data = address 

    var host: NSString? 
    var port1: UInt16 = 0 
    GCDAsyncUdpSocket.getHost(&host, port: &port1, fromAddress: address) 
    println("From \(host!)") 

    let gotdata = NSString(data: data, encoding: NSASCIIStringEncoding) 
    //let gotdata: NSString = NSString(data: data, encoding: NSUTF8StringEncoding) 
    println(gotdata) 
} 

Это результат:

didReceiveData 
From 192.168.1.114 
wþÀ¨r 

Как вы можете видеть, это куча странных персонажей.

Исходные данные <100277fe c0a80172 00000000 00000000> (путем написания println(data)). Здесь первые 4 байта представляют собой часть wþÀ¨r, а следующие 4 - это IP-адрес, который я уже извлек из функции getHost().

Я не могу найти какую-либо вспомогательную функцию для извлечения фактических данных, полученных UDP-сервером. Я знаю, что представление ASCII ответа UDP «привет». Однако, если я изменю это на что-то еще, это не отразится на данных, которые я вижу в части отладки Xcode. Это всегдаwþÀ¨r.

Я пробовал оба с NSASCIIStringEncoding и NSUTF8StringEncoding, но последний приводит к исключению времени выполнения EXC_BAD_ACCESS.

Насколько я мог найти, это то, как люди обычно делают это в Objective-C (внутри функции didReceiveData):

NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

Как найти сообщение «привет» в UDP ответ как строковое представление?

ответ

0

Это довольно глупо, но удаление ! из didReceiveData data: NSData! часть функции udpSocket решила проблему.

То есть, функция должна быть определена следующим образом:

func udpSocket(sock: GCDAsyncUdpSocket!, didReceiveData data: NSData, fromAddress address: NSData!, withFilterContext filterContext: AnyObject!) { 
    .... 
} 
+0

The! делает его необязательным с неявной разверткой. Думайте, что вам может понадобиться понизить его до NSData. Использование встроенного литья «как?» и назначить локальную переменную перед использованием. – casillic

1

Скорее всего, формат сообщения - это просто не то, что вы думаете о нем, или вы отправляете неверные данные. Почему вы считаете, что полезная нагрузка пакета точно «привет» без дополнительного (прикладного уровня) заголовка? Вы смотрели сетевое соединение с Wireshark или tcpdump для проверки?

Тот факт, что первый байт является точно длиной сообщения (16 байт), и вы указываете, что байты 3-7 являются IP-адресом, я бы сильно подозревал, что ваше сообщение имеет какой-то заголовок, и это что вы смотрите здесь.

2

Вы назначены адреса в переменных данных в первой строке, тем самым переписав значение в данных.

let data = address 

Я скопировал ваш код, чтобы попробовать что-то еще и заметил ошибку.

Смежные вопросы