如何关闭rcvfrom上被阻止的UDP套接字

如何关闭rcvfrom上被阻止的UDP套接字,c,sockets,udp,nsthread,C,Sockets,Udp,Nsthread,我正在使用C套接字为iPhone开发应用程序。在某个时刻,我在单独的NSThread(正在阻塞)上执行recvfrom,我不知道如何强制此操作“取消阻塞”并优雅地退出线程。调用shutdown()或close()不会改变任何东西,recvfrom仍然挂起。有没有办法让它保持阻塞状态,迫使它正确关闭并退出线程 因为我被指控没有尝试任何东西,这是我的一段代码,它不会导致recvfrom去“解锁”: 这就是我现在拥有的: - (void) stopScan { NSLog(@"stopScan

我正在使用C套接字为iPhone开发应用程序。在某个时刻,我在单独的
NSThread
(正在阻塞)上执行
recvfrom
,我不知道如何强制此操作“取消阻塞”并优雅地退出线程。调用
shutdown()
close()
不会改变任何东西,
recvfrom
仍然挂起。有没有办法让它保持阻塞状态,迫使它正确关闭并退出线程

因为我被指控没有尝试任何东西,这是我的一段代码,它不会导致
recvfrom
去“解锁”:

这就是我现在拥有的:

- (void) stopScan
{
    NSLog(@"stopScan !!!");
    [activityIndicator stopAnimating];
    shutdown(broadcastSocket, SHUT_RDWR);
    close(broadcastSocket);
    [discoveryThread cancel];
    [discoveryThread release];
    discoveryThread = nil;
    [scanTimer invalidate];
    broadcastSocket = 0;
    scanTimer = nil;
}

仅调用
shutdown()
close()
也不会解除阻止。

听起来您实际上没有尝试过任何东西。把它关上。
recvfrom()
将以错误退出。

因此,为了给这个问题/答案添加更多内容,我似乎以某种方式删除了错误检查代码,我的应用程序进入无限循环,连续调用recvfrom,这在我的应用程序的不同位置导致了其他问题。这个答案不仅错误,而且危险。特别是,可能会发生严重的争用情况:1)调用
rcvfrom
的线程没有得到调度。2) 你把插座合上。3) 另一个线程打开一个新套接字并获取相同的描述符。4) 调用
rcvfrom
的线程最终被调度并从一个不相关的网络连接读取。Boom@DavidSchwartz我不相信这一点。当
recvfrom()
在内核中实际阻塞时,它不仅阻塞套接字描述符值,而且阻塞内核中的实际指针和TBC。关闭/打开将神奇地必须使用完全相同的地址取消分配和重新分配所有这些内容,并且它还必须在不注意套接字描述符的现有用户需要向其发送错误代码的情况下执行此操作。我认为一个具有所有这些功能的内核包含了一个主要的bug。@EJP您没有抓住线程调用
rcvfrom
没有得到调度的要点。在调度之前,它不能在内核中阻塞。在这一点上,它只知道整数描述符,在POSIX下,它通常保证可以重用。