Я провожу некоторые тесты с 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, должен иметь возможность подключиться к определенному адресу.