Сервер сокетов iPhone не остановится, когда сверстники будут живы - PullRequest
1 голос
/ 12 октября 2011

У меня проблемы с использованием сокетов для моего приложения для iPhone.Я надеюсь, что кто-то может мне помочь.

Проблема, с которой я столкнулся, заключается в ситуации, когда я хочу закрыть свой сокет сервера, который принимает сокеты для соединения.У меня есть список сокетов, сделанных через accept.Когда я хочу остановить сервер, сначала просматриваю список и закрываю все сокеты, прежде чем закрыть сервер.Но это не работает.Когда я хочу снова запустить сервер, я получаю сообщение «Адрес уже используется».Я использую объекты CFSocketRef для обработки сокетов.Код довольно большой, поэтому я показываю лишь некоторые фрагменты, обрабатывающие их.

Сначала я запускаю сервер

Function: StartServer
...
//Create Server Socket
socket = CFSocketCreate(nil, PF_INET, SOCK_STREAM, IPPROTO_TCP, 
         kCFSocketAcceptCallBack, socketServerRunLoopCallBack, &socketContext);
...
//Set Socket to RunLoop for Accept
runLoop = CFRunLoopGetCurrent();
socketRunLoop = CFSocketCreateRunLoopSource(nil, socket, 0);
CFRunLoopAddSource(runLoop, socketRunLoop, kCFRunLoopDefaultMode);

Теперь сервер ждет подключения к клиентам.это будет сделано RunLoop и CallBack

Function: CreateSocketFromPeer
...
//socket is NOT the same reference than above. This reference
//is in an independent instance.
socket = CFSocketCreateWithNative(nil, theSocketNative, kCFSocketReadCallBack, 
         socketRunLoopCallBack, &socketContext);
//theSocketNative is the socket handle that the server got from the CallBack
socketNative = theSocketNative;

Теперь сервер хочет быть закрытым.Но сокет, созданный сервером для однорангового узла, все еще открыт.Таким образом, сервер пытается закрыть его

Function: StopServer
...
//Stop the RunLoop
CFRunLoopRemoveSource(runLoop, socketRunLoop, kCFRunLoopDefaultMode);
CFRunLoopSourceInvalidate(socketRunLoop);
CFRelease(socketRunLoop);
socketRunLoop = nil;
//disconnect any peer made by the servers accept CallBack
for (GTSocket *entry in connections)
    [entry disconnect];
//stop now the server
CFSocketInvalidate(socket);
CFRelease(socket);
socket = nil;
socketNative = -1;

, который сервер закрыл, используя функцию отключения сокета, обрабатывающего одноранговый узел.

Function: Disconnect
CFSocketInvalidate(socket);
CFRelease(socket);
socket = nil;
socketNative = -1;

Тем не менее, сервер не будет корректно останавливаться дажекогда я аннулирую сокет, созданный CFSocketCreateWithNative ... Может кто-нибудь мне помочь?

РЕДАКТИРОВАТЬ

Ситуация ухудшается.

Я проверил некоторые идеи, которые я получил, но ничего не кажетсяпомогать.Следующее должно когда-либо быть успешным.но не в моем случае

в обратном вызове моего сервера сокетов, который я написал после

static void socketServerRunLoopCallBack(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const void *data, void *info) {
    if (type == kCFSocketAcceptCallBack) {
        close(*(CFSocketNativeHandle *)data);
    }
}

, это должно немедленно закрыть одноранговый узел, но все же, если я закрою и снова открою сервер сокетов, я получу "Адрес"уже используется "

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

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