Клиент (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 ... Так что я думаю, что есть другой способ.