客户端(iOS)发送消息,服务器检查并回答。 iOS显示答案。
有两种类型的答案。一个只是一个答案。服务器只发送一次。 另一个有点不同。服务器发送20次。
当服务器发送一次时,我可以很好地处理。这并不难。
问题在于第二种类型:
我尝试了两种获取数据的方法。 首先,我使用了一个简单的CFSocket示例并进行了一些修改。当它收到消息时,它运行良好。当它收到20条消息时,它会因错误而停止。它说“节目收到信号'SIGABRT'”
//主要代码
CFSocketRef ref = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_DGRAM, 0, kCFSocketReadCallBack|kCFSocketDataCallBack|kCFSocketConnectCallBack|kCFSocketWriteCallBack, CFSockCallBack, NULL);
struct sockaddr_in theName;
struct hostent *hp;
theName.sin_port = htons(5003);
theName.sin_family = AF_INET;
hp = gethostbyname(IPADDRESS);
if( hp == NULL ) {
return;
}
memcpy( &theName.sin_addr.s_addr, hp->h_addr_list[PORT_NUM], hp->h_length );
CFDataRef addressData = CFDataCreate( NULL, &theName, sizeof( struct sockaddr_in ) );
CFSocketConnectToAddress(ref, addressData, 30);
CFRunLoopSourceRef FrameRunLoopSource = CFSocketCreateRunLoopSource(NULL, ref , 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), FrameRunLoopSource, kCFRunLoopCommonModes);
//回调方法
void CFSockCallBack (
CFSocketRef s,
CFSocketCallBackType callbackType,
CFDataRef address,
const void *data,
void *info
) {
NSLog(@"callback!");
if(callbackType == kCFSocketDataCallBack) {
[lock lock];
NSLog(@"has data");
UInt8 * d = CFDataGetBytePtr((CFDataRef)data);
int len = CFDataGetLength((CFDataRef)data);
for(int i=0; i < len; i++) {
// NSLog(@"%c",*(d+i));
}
//Data processing area=
[lock unlock];
}
if(callbackType == kCFSocketReadCallBack) {
NSLog(@"to read");
char buf[100] = {0};
int sock = CFSocketGetNative(s);
NSLog(@"to read");
NSLog(@"read:%d",recv(sock, &buf, 100, 0));
NSLog(@"%s",buf);
}
if(callbackType == kCFSocketWriteCallBack) {
NSLog(@"to write");
char sendbuf[100]={0x53, 0x4D, 0x49, 0x43, 0x2};
//strcpy(sendbuf,"GET / HTTP/1.0\r\n\r\n");
//NSLog(@"%c",0x53);
CFDataRef dt = CFDataCreate(NULL, sendbuf, 5);
CFSocketSendData(s, NULL, dt, strlen(sendbuf));
}
if(callbackType == kCFSocketConnectCallBack) {
NSLog(@"connected");
}
}
第二种方法是使用CocoaAsyncSocket
。它似乎运作良好。但有时它会因错误而停止
我用了GCDAsyncUDPSocket
。它随信号“EXC_BAD_ACCESS”随机停止。
我在Android上做得很好......所以我认为还有其他方法可行。