Попробую открыть поток записи на сокет в OS X

Прочитав много примеров в Интернете, я попытался написать короткую простую программу для проверки сокетного соединения между двумя компьютерами. У меня есть эти два компьютера

  • клиент, 192.168.0.116, запустив программу ниже
  • сервер, 192.168.0.118, работает http://sockettest.sourceforge.net/ в режиме прослушивания сервера на порту 6237

Я начал с еще более простого синхронного дизайна, но перешел на runloop / async, когда это не сработало.

Симптом: CFWriteStreamOpen возвращает true (успех), но поток остается в состоянии kCFStreamStatusOpening неопределенно долго. Обратный вызов никогда не вызывается для подтверждения того, что open завершен (фактически он никогда не вызывается для какого-либо события).

Я подозревал, что у меня могут быть проблемы с сетью (брандмауэр и т. Д.), Которые могут помешать этому соединению. Чтобы опровергнуть эту теорию, я побежал http://sockettest.sourceforge.net/ на клиенте, а также клиент и сервер подключены нормально.

#include <iostream>
#include <CoreFoundation/CFStream.h>
using namespace std;

CFStreamClientContext myContext = {0,NULL,NULL,NULL,NULL};

#define SA_HOST "192.168.0.118"//#define SA_HOST "127.0.0.1"#define SA_PORT 6237
UInt8 buf[5] = { 0, 1, 2, 3, 4 };
UInt8 *wp = buf;
UInt16 bytesQueued = 5;
UInt16 bytesSent = 0;

static const CFOptionFlags kWriteStreamEvents =
kCFStreamEventEndEncountered |
kCFStreamEventErrorOccurred |
kCFStreamEventCanAcceptBytes |
kCFStreamEventOpenCompleted |
kCFStreamEventNone;

void WriteStreamCB(CFWriteStreamRef writeStream, CFStreamEventType event, void *clientCallBackInfo)
{
switch (event)
{
case kCFStreamEventEndEncountered:
{
cout << "in CallBack: kCFStreamEventEndEncounteredd" << endl;
CFWriteStreamClose(writeStream);
break;
}
case kCFStreamEventErrorOccurred:
{
cout << "in CallBack: kCFStreamEventErrorOccurred" << endl;
CFStreamError err = CFWriteStreamGetError(writeStream);
cout << "in Callback: stream error, domain: " << err.domain << ", value: " << err.error << endl;
break;
}
case kCFStreamEventCanAcceptBytes:
{
cout << "in CallBack: kCFStreamEventCanAcceptBytes" << endl;

bytesSent = CFWriteStreamWrite(writeStream, buf, 5);
if (bytesSent > 0)
{
bytesQueued -= bytesSent;
wp += bytesSent;
cout << "CFWriteStreamWrite wrote " << bytesSent << " bytes, " << bytesQueued << " left" << endl;
}
else
{
cout << "CFWriteStreamWrite returned " << bytesSent << endl;
}
break;
}
case kCFStreamEventNone:
{
cout << "in CallBack: kCFStreamEventNone" << endl;
break;
}
case kCFStreamEventOpenCompleted:
{
cout << "in CallBack: kCFStreamEventNone" << endl;
break;
}
}
}

int main(int argc, const char * argv[]) {
CFWriteStreamRef   writeStream;
CFStringRef host = CFSTR(SA_HOST);
UInt32 port = SA_PORT;

CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host, port, NULL, &writeStream);
CFWriteStreamSetClient(writeStream, kWriteStreamEvents, WriteStreamCB, &myContext);
CFWriteStreamScheduleWithRunLoop(writeStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);

if (!CFWriteStreamOpen(writeStream))
{
return -1;
}

while (true);

return 0;
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector