Проблемы с функцией CFSocketSendData со вторым аргументом - PullRequest
0 голосов
/ 19 июня 2011

Я провожу некоторые тесты с iPhone Sockets.Вот код (это работает):

struct sockaddr_in destinationAddress;
socklen_t sockaddr_destaddr_len = sizeof(destinationAddress);
CFSocketError socket_error = 0;

CFSocketRef socket = CFSocketCreate(kCFAllocatorDefault,  
                                    AF_INET, 
                                    SOCK_STREAM,
                                    IPPROTO_TCP,
                                    kCFSocketNoCallBack,
                                    NULL,
                                    NULL);

if (!socket) {
    NSLog(@"CfSocketCreate Failed");
}

memset(&destinationAddress, 0, sockaddr_destaddr_len);
destinationAddress.sin_len = sockaddr_destaddr_len;
destinationAddress.sin_family = AF_INET;
destinationAddress.sin_port = htons(23678);
destinationAddress.sin_addr.s_addr = inet_addr("127.0.0.1");

NSData *destinationAddressData = [NSData dataWithBytes:&destinationAddress length:sizeof(destinationAddress)];

NSString *message = @"data to send, new line\n";
NSData *message_data = [message dataUsingEncoding:NSUTF8StringEncoding];

CFSocketConnectToAddress(socket, (CFDataRef) destinationAddressData, 10);
socket_error = CFSocketSendData (socket, NULL, (CFDataRef) message_data, 10);

// show the status
if(socket_error < 0){
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Socket situation"
                                                    message:@"Socket error"
                                                   delegate:self 
                                          cancelButtonTitle:@"Ok" 
                                          otherButtonTitles:nil];
    [alert show];
    [alert release];
}

Итак, прежде всего я открываю соединение с другим сокетом (мой сервер журналов).Во-вторых, я отправляю данные через CFSockectSendData с параметром 2nd NULL, чтобы использовать открытое ранее соединение.Проблема заключается в том, что я пытаюсь отправить данные напрямую, используя функцию CFSocketSendData, без использования функции CFSocket CFSocketConnectToAddress.Код становится:

struct sockaddr_in destinationAddress;
socklen_t sockaddr_destaddr_len = sizeof(destinationAddress);
CFSocketError socket_error = 0;

CFSocketRef socket = CFSocketCreate(kCFAllocatorDefault,  
                                    AF_INET, 
                                    SOCK_STREAM,
                                    IPPROTO_TCP,
                                    kCFSocketNoCallBack,
                                    NULL,
                                    NULL);

if (!socket) {
    NSLog(@"CfSocketCreate Failed");
}

memset(&destinationAddress, 0, sockaddr_destaddr_len);
destinationAddress.sin_len = sockaddr_destaddr_len;
destinationAddress.sin_family = AF_INET;
destinationAddress.sin_port = htons(23678);
destinationAddress.sin_addr.s_addr = inet_addr("127.0.0.1");

NSData *destinationAddressData = [NSData dataWithBytes:&destinationAddress length:sizeof(destinationAddress)];

NSString *message = @"data to send, new line\n";
NSData *message_data = [message dataUsingEncoding:NSUTF8StringEncoding];

socket_error = CFSocketSendData (socket, (CFDataRef) destinationAddressData, (CFDataRef) message_data, 10);

// show the status
if(socket_error < 0){
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Socket situation"
                                                    message:@"Socket error"
                                                   delegate:self 
                                          cancelButtonTitle:@"Ok" 
                                          otherButtonTitles:nil];
    [alert show];
    [alert release];
}

В этом случае я собираю ошибку с CFSocketSendData, и будет показано представление предупреждения.В чем ошибка?Просто я удалил функцию CFSocketConnectToAddress, потому что CFSocketSendData со вторым параметром, отличным от NULL, должен иметь возможность подключиться к определенному адресу.

1 Ответ

0 голосов
/ 19 июня 2011

Нет.TCP - это протокол, ориентированный на соединение.Вы должны установить соединение, прежде чем отправлять какие-либо данные.Он не «соединяется с определенным адресом» для вас, потому что возможность указать адрес получателя состоит в том, чтобы иметь возможность повторно использовать один и тот же сокет для нескольких получателей.Что бы произошло, если бы вы вызвали CFSocketSendData () с другим адресом?Будет ли старая связь закрыта?Если нет, как бы вы закрыли одно из соединений, не закрывая другое?

Если вместо этого вы используете UDP (укажите SOCK_DGRAM вместо SOCK_STREAM), вы можете указать разные адреса для каждого пакета.Конечно, обратите внимание на многочисленные предостережения с использованием UDP (без гарантированной доставки, без какого-либо управления потоком, и вы должны выполнить свое собственное «управление соединением», потому что не существует такого понятия, как соединение UDP).* В этом случае я получаю сообщение об ошибке с CFSocketSendData, и будет отображаться представление предупреждений.В чем ошибка?

Ну, что сказал UIAlertView?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...