我在iPhone应用程序中使用套接字时遇到了一些问题。我希望有人可以帮助我。
我遇到的问题是,当我想关闭我的服务器套接字时,就是接受连接的套接字。我有一个通过接受制作的套接字列表。当我想要停止服务器时,我首先浏览列表并在关闭服务器之前关闭所有套接字。但这不起作用。当我想再次启动服务器时,我收到消息“地址已在使用中”。我使用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;
服务器使用处理对等体的套接字的disconnect函数关闭了。
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);
}
}
这应该立即关闭对等方但仍然如果我关闭并重新打开套接字服务器我得到“地址已经在使用”
我简化了我的代码,为连接提取了不必要的东西,但是当我想要关闭服务器套接字时,我仍然无法关闭对等端。