BSD Socket CFReadStreamRef и CFWriteStreamRef - PullRequest
0 голосов
/ 27 ноября 2010

У меня есть сервер Java. Я пытаюсь создать приложение для iPhone, которое подключается к серверу. Также отправляет и получает сообщения. Я немного запутался в использовании CFReadStreamRef и CFWriteStreamRef. Как я могу соединить сокет с потоками успешно. Вот что у меня есть:

fd = socket(AF_INET, SOCK_STREAM, 0);
emset(&addr, 0, sizeof(addr));
addr.sin_len    = sizeof(addr);
addr.sin_family = AF_INET;
addr.sin_port   = htons(port);//0;
inet_aton("192.168.1.101", &addr.sin_addr.s_addr);

CFSocketContext context = { 0, self, NULL, NULL, NULL };

listeningSocket = CFSocketCreateWithNative( NULL, fd,kCFSocketConnectCallBack, AcceptCallback, &context);

CFDataRef connectAddr = CFDataCreate(NULL, (unsigned char *)&addr, sizeof(addr));
CFSocketConnectToAddress(self.listeningSocket, connectAddr, -1);

// As soon as i get the Connect call back into my function I try to pair the streams to the socket
CFReadStreamRef     readStreamm;
CFWriteStreamRef    writeStreamm;

CFStreamCreatePairWithSocket(NULL, CFSocketGetNative(listeningSocket), &readStreamm, &writeStreamm);
[readStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[writeStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

[readStream open];
[writeStream open];

Однако, когда я пытаюсь писать или читать из потока, возвращается ошибка (-1). Другой вопрос, который я имею, если я использую readStream или writeStream open, и если это было успешно. Это значит, что я уже подключен к серверу ?? или мне действительно нужно позвонить CFSocketConnectToAddress. Я просто пытаюсь выяснить, нужно ли мне использовать как connectToAdderss, так и поток, открытый. Или я должен использовать один или другой.

Спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2010

Проходит реализация cocoaasyncsocket.Сокет должен быть закрыт перед открытием потоков чтения / записи.Я использовал CFSocketConnectToAddress, затем аннулировал и выпустил сокет.Тогда установите мои потоки.qoute:

// Invalidate and release the CFSocket - All we need from here on out is the nativeSocket
// Note: If we don't invalidate the socket (leaving the native socket open)
// then theReadStream and theWriteStream won't function properly.
// Specifically, their callbacks won't work, with the exception of kCFStreamEventOpenCompleted.
// I'm not entirely sure why this is, but I'm guessing that events on the socket fire to the CFSocket we created,
// as opposed to the CFReadStream/CFWriteStream.

CFSocketInvalidate(listeningSocket);
CFRelease(listeningSocket);
listeningSocket = NULL:
0 голосов
/ 27 ноября 2010

Я рекомендую использовать cocoaasyncsocket .Это легкая оболочка, которая значительно упрощает общение на основе сокетов.Сейчас я работаю над связью между iPhone и сетевым устройством.Работает без нареканий.

[sock writeData:[@"Hello World" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:1];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...