Задать вопрос
@iogurt89

CFSocket! Почему не приходят данные?

Добрый день. Разбираюсь с CFSocket. И при попытке передать данные от одного сокета в другой почему-то они не передаются. Вроде бы все делаю правильно. Книжки читал, лекции смотрел, статьи читал на эту тему. Но пока не могу понять в чем дело. Прошу помощи разобраться. Код ниже.

Client

CFSocketRef 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);


Server

CFSocketRef 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;
    }


Всем кто ответит заранее, огромное спасибо!
  • Вопрос задан
  • 350 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@rettpop
Пока человечество не преподает экстрасенсорику в школе, логгирование — наиважнейшее из искусств (с) ВИЛ.
Нужны логи и клиента, и сервера. Что отправляется, что принимается, происходит ли подключение, происходит ли байндинг порта...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы