У меня проблемы с использованием сокетов для моего приложения для 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);
}
}
, это должно немедленно закрыть одноранговый узел, но все же, если я закрою и снова открою сервер сокетов, я получу "Адрес"уже используется "
Я упростил свой код, извлекая все ненужное для соединения, но я все еще не могу закрыть одноранговые узлы, когда хочу закрыть сокет сервера.