2016-05-22 40 views
0

我使用套接字创建程序。我有两个套接字:一个用于监听,另一个用于连接到外部服务器。 一个连接到服务器以无限循环读取数据的服务器不断将数据传输到我的程序,并在“实时”中写入该数据以输出。如何处理两个套接字,当一个套接字在后台做事

第二个正在收听消息 - 当消息处于暂停状态时,程序应停止从第一个套接字读取数据。

如何处理这种情况? Poll()/ select()不是解决方案,因为这两个套接字需要同时工作,并且当轮询检测到要从套接字一读取的数据时,我将进入无限循环,并停止在第二个套接字上侦听。

我曾想过要在不断的时间内打破从服务器读取数据的无限循环,但是当消息到来时,它必须等待。

请帮帮我!

+0

我不明白为什么民意调查/选择不是解决方案在这里 - 为什么你“进入无限循环,并停止聆听”?不过,多线程是另一种可能的解决方案。 –

+0

使用多线程,其中一个线程根据需要不断侦听。或者定期轮询套接字并将接收到的数据排入某种缓冲区/队列。 – ArchbishopOfBanterbury

+0

@OliverCharlesworth poll/select等到一个或多个文件描述符变为“准备就绪”,我的第一个套接字总是准备好,那么第二个套接字应该“说”什么? – Michocio

回答

4

我最好的建议是epoll(),因为我使用它,但我敢肯定,你可以用轮询()选择()做到这一点也。阅读手册并试一试。

Here是如何使用它的一个很好的例子。

祝你好运。

0

在你的情况下,我会用epoll与多个线程。当然,你必须处理多线程的所有有趣的潜在问题,如饥饿或死锁。我发现this资源可以帮助你实现这样的解决方案。

如果您需要更多关于epoll的信息,请查看c10k问题中的epoll section。在异步编程中也有这种说话epoll的link