如果我使用 select() 服务器而不使用 fork()、线程、共享内存、信号量来编写对等 2 对等应用程序,这可以吗?
Posted
技术标签:
【中文标题】如果我使用 select() 服务器而不使用 fork()、线程、共享内存、信号量来编写对等 2 对等应用程序,这可以吗?【英文标题】:Is this ok if I write a peer 2 peer apps using select() server without using fork(), thread, shared memory, semaphores? 【发布时间】:2014-05-18 16:22:14 【问题描述】:我正在编写一个peer 2 peer chat,它在同一个文件中包含客户端部分和服务器部分。目前,我使用select()
服务器,不使用fork()
、线程、共享内存、信号量来处理并发(我只是使用select()
来区分客户端和服务器的套接字)。
由于我每次启动应用程序时只创建一个进程,假设我的应用程序名为 P2P。我通过./P2P PortofServer PortServerofPeerIconnect IPAddress
启动一个对等点(包括客户端和服务器)。在 while 循环中,我使用 select()
等待来自客户端的连接以获取服务器部分。每次我启动一个对等点时,客户端部分都会连接到其他对等点的服务器部分。
是否可以不使用fork()
,线程而只使用select()
来编写peer 2 peer chat?非常感谢。
【问题讨论】:
前叉模型已过时。事实上,与更现代的异步 IO 相比,即使是 select 也被认为是次要的。考虑使用 boost asio 或 libevent 之类的库。 您好 usr,我想确认如果我使用 select() 服务器方法而不使用 fork()、线程、共享内存、信号量,是否可以。如果不使用fork(),线程,是否需要使用共享内存,信号量?非常感谢您的评论。 我认为你应该在使用它们之前了解这些调用和技术的作用。听起来您不了解它们,并且正在依靠食谱来编写程序。你不会成功的。 你好,用户。谢谢你的评论。但是,我想知道我是否使用这种 select() 服务器方法,由于客户端和服务器都写在同一个文件中,将来在连接中是否有任何困难。 zuhakasa,前叉模型既不落伍也不逊色,而是工具箱中的一种工具。如果您不以一种或另一种方式进行多任务处理(即多个进程或线程),您可能不需要共享内存或同步。但是你的基本问题是无法回答的。 Select 本身在某种程度上可以正常工作,但迟早您可能会遇到缩放或代码复杂性问题。是现在还是以后咬紧牙关,只有您可以回答,这取决于您对项目发展的设想。 【参考方案1】:无论您选择何种方式与操作系统交互(select()
或 cmets libevent、epoll()
、kqueue 或 boost::asio 中的建议,如果 c++ 是可接受的解决方案),asynchronous mode 将允许您如果正确实施并且没有任何东西阻塞主调度循环,则在单个线程中处理所有内容。
所以是的,如果您在异步模式下使用所有 IO 是可能的。但是请准备好读取和写入可以在字符串/数据包的中间终止,否则如果select()
表示套接字尚未准备好进行所需的操作(包括write
),您将被阻止。所有到服务器的新连接(套接字)和来自控制台的用户输入(我猜,因为它是一个聊天程序)都必须通过select()
(或其他事件调度机制)。
【讨论】:
嗨 Anton,你能告诉我 select() 什么时候说套接字还没有准备好进行所需的操作吗?如果我选择 select(),这是否意味着套接字在没有通信发生时保持打开状态,不是吗?但是如果我使用 fork() 或 thread 代替,我可以在子线程或子线程完成通信后关闭套接字。非常感谢您的评论。 @zuhakasa,select
将文件描述符(句柄)标记为准备好读取或准备好写入或有异常。使用man select
中描述的FD_ISSET 来找出select
试图告诉你什么。套接字必须保持打开状态,直到您需要它进行通信,然后在不需要或另一端关闭连接时关闭它。与fork
或线程完全一样。以上是关于如果我使用 select() 服务器而不使用 fork()、线程、共享内存、信号量来编写对等 2 对等应用程序,这可以吗?的主要内容,如果未能解决你的问题,请参考以下文章