AsyncSocket如何用N个字节构造前缀来表示数据包的长度?

时间:2012-10-01 14:50:01

标签: cocoaasyncsocket

我是iOS套接字编程的新手。我用erlang和{packet,4}实现了一个tcp服务器,很容易在erlang套接字之间进行通信。但是如何在AsyncSocket中将数据包的长度预先设置为4个字节?

有些代码表示赞赏。

我测试过如下,但对我的服务器端没有影响:

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];

1 个答案:

答案 0 :(得分:0)

您告诉服务器您正在发送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];