Добрый день. Разбираюсь с CFSocket. И при попытке передать данные от одного сокета в другой почему-то они не передаются. Вроде бы все делаю правильно. Книжки читал, лекции смотрел, статьи читал на эту тему. Но пока не могу понять в чем дело. Прошу помощи разобраться. Код ниже.
ClientCFSocketRef socket = CFSocketCreate(kCFAllocatorDefault, AF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketNoCallBack, NULL, NULL);
struct sockaddr_in addressSend;
memset(&addressSend, 0, sizeof(addressSend));
addressSend.sin_len = sizeof(addressSend);
addressSend.sin_family = AF_INET;
addressSend.sin_addr.s_addr = inet_addr("127.0.0.1");
addressSend.sin_port = htons(8908);
CFDataRef addressSendData = CFDataCreate(kCFAllocatorDefault, (const UInt8 *)&addressSend, sizeof(addressSend));
NSString *dataString = @"Hello World";
NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];
CFDataRef sendData = CFDataCreate(kCFAllocatorDefault, [data bytes], data.length);
CFTimeInterval timeOut = 5.0;
CFSocketError errorConnect = CFSocketConnectToAddress(socket, addressSendData, timeOut);
if (errorConnect != kCFSocketSuccess) {
NSLog(@"Connect error");
}
CFSocketError errorSendData = CFSocketSendData(socket, addressSendData, sendData, timeOut);
if (errorSendData != kCFSocketSuccess) {
NSLog(@"Send data error");
}
CFRelease(addressSendData);
CFRelease(sendData);
ServerCFSocketRef socket = CFSocketCreate(kCFAllocatorDefault, AF_INET, SOCK_STREAM, IPPROTO_TCP,
kCFSocketDataCallBack, TCPServerAcceptCallBack, NULL);
int reuse = true;
int fileDescriptor = CFSocketGetNative(socket);
if (setsockopt(fileDescriptor, SOL_SOCKET, SO_REUSEADDR,
(void *)&reuse, sizeof(int)) != 0) {
NSLog(@"Error");
return;
}
struct sockaddr_in address;
memset(&address, 0, sizeof(address));
address.sin_len = sizeof(address);
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8908);
CFDataRef addressData = CFDataCreate(kCFAllocatorDefault, (const UInt8 *)&address, sizeof(address));
CFSocketSetAddress(socket, addressData);
CFRunLoopSourceRef socketsource = CFSocketCreateRunLoopSource(kCFAllocatorDefault, socket, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), socketsource, kCFRunLoopDefaultMode);
CFRelease(addressData);
//-----------------------------------------------------------------------------------------------------------------
// Обработка событий сокета!
void TCPServerAcceptCallBack(CFSocketRef socket,
CFSocketCallBackType type,
CFDataRef address,
const void *data,
void *info) {
switch (type) {
case kCFSocketAcceptCallBack:
NSLog(@"Connection");
break;
case kCFSocketDataCallBack:
NSLog(@"Data %@", data); //Тут я ожидаю что в консоль выведется строка в бинарном виде, которую я передал.
//но в консоли вижу это "Data <>"
break;
default:
break;
}
Всем кто ответит заранее, огромное спасибо!