AsyncSocket как создать префикс с N байтами, указывающий длину пакета?

Я новичок в программировании сокетов iOS. Я реализовал tcp-сервер с erlang с {packet, 4}, легко общаться между сокетами erlang. Но как я могу добавить длину пакета в 4 байта в AsyncSocket?

Некоторые коды приветствуются.

Я тестировал, как показано ниже, но это не повлияло на мою серверную часть:

int s = 10;
NSMutableData *headData = [NSMutableData dataWithBytes:&s length:4];

const char *body = [@"hello" UTF8String];
NSMutableData* bodyData = [NSMutableData dataWithBytes:body length:strlen(body)];

[sock writeData:headData withTimeout:-1 tag:100];
[sock writeData:bodyData withTimeout:-1 tag:101];

person Yejun Su    schedule 01.10.2012    source источник


Ответы (1)


Вы сообщаете серверу, что отправляете 10 байт, хотя на самом деле это не так. Вам нужно использовать фактическую длину данных, которые вы отправляете. И, кроме того, поскольку сервер может иметь другой порядок байтов, чем ваша машина, вам нужно решить, является ли длина прямым порядком байтов или прямым порядком байтов в вашем протоколе:

const char *body = [@"hello" UTF8String];
NSMutableData* bodyData = [NSMutableData dataWithBytes:body length:strlen(body)];

uint32_t s = strlen(body);
uint32_t swapped = CFSwapInt32HostToBig(s)
NSMutableData *headData = [NSMutableData dataWithBytes:&swapped length:4];

[sock writeData:headData withTimeout:-1 tag:100];
[sock writeData:bodyData withTimeout:-1 tag:101];
person Donovan Voss    schedule 28.02.2013