如果我使用select()服务器编写一个对等2应用程序,而不使用fork()、线程、共享内存和信号量,这样可以吗?

如果我使用select()服务器编写一个对等2应用程序,而不使用fork()、线程、共享内存和信号量,这样可以吗?,c,sockets,semaphore,shared-memory,p2p,C,Sockets,Semaphore,Shared Memory,P2p,我正在写一个peer2peer聊天,它在同一个文件中包含客户机部分和服务器部分。目前,我正在使用select()server,而不是使用fork()、线程、共享内存、信号量来处理并发性(我只是使用select()来区分客户机和服务器的套接字) 因为我每次启动应用程序时只创建一个进程,所以我的应用程序名为P2P。我通过/P2P-PortofServer-portserverofpecirconnect-IPAddress启动一个对等机(包括客户端和服务器)。在while循环中,我使用select(

我正在写一个peer2peer聊天,它在同一个文件中包含客户机部分和服务器部分。目前,我正在使用
select()
server,而不是使用
fork()
、线程、共享内存、信号量来处理并发性(我只是使用
select()
来区分客户机和服务器的套接字)

因为我每次启动应用程序时只创建一个进程,所以我的应用程序名为P2P。我通过
/P2P-PortofServer-portserverofpecirconnect-IPAddress
启动一个对等机(包括客户端和服务器)。在while循环中,我使用
select()。每次我启动对等机时,客户端将连接到其他对等机的服务器部分


是否可以不使用
fork()
,线程,而只使用
select()
编写对等聊天?非常感谢。

< p>无论您选择与OS交互的方式(<代码>选择())<代码>,或者如注释LabEnter、<代码> eBuleEf(<代码> >、KQueor、或甚至Booo::ASIO,如果C++是可接受的解决方案),如果实现正确,将允许您在单个线程中处理所有内容,并且没有任何内容会阻止主调度循环


因此,是的,如果您在异步模式下使用所有IO,这是可能的。但是要做好准备,读写操作可以在字符串/数据包的中间终止,或者如果
select()
表示套接字未准备好进行所需操作(包括
write
),您将被阻止。所有到服务器的新连接(套接字)和来自控制台的用户输入(我猜,因为它是一个聊天程序)都必须通过
select()
(或其他事件调度机制)。

fork模型已经过时。事实上,与更现代的异步IO相比,甚至select也被认为是低劣的。考虑使用像Boost ASIO或LeBurv.H.USR这样的库,我想确认,如果不使用Frk()、线程、共享内存、信号量,就可以使用SoopTy*(服务器)方法。如果我不使用fork(),thread,我是否需要使用共享内存,信号量?非常感谢您的评论。我认为在使用这些调用和技术之前,您应该了解它们的作用。听起来你好像不理解它们,而是依靠食谱来编写程序。你不会成功的。嗨,usr。谢谢你的评论。但是,我想知道,如果我使用这个select()服务器方法,将来在连接中是否会遇到任何困难,因为客户端和服务器都写在同一个文件中。zuhakasa,fork模型既不是过时的,也不是劣等的,而是工具箱中的一个工具。如果您不以一种或另一种方式(即多个进程或线程)执行多任务,则可能不需要共享内存或同步。但你的基本问题是无法回答的。Select本身在某种程度上可以正常工作,但迟早您可能会遇到伸缩性或代码复杂性问题。你是现在咬紧牙关还是以后咬紧牙关,这取决于你对项目发展的设想。嗨,安东,你能告诉我select()何时表示套接字还没有准备好进行所需的操作吗?如果我选择select(),这是否意味着在没有通信发生时套接字保持打开状态,不是吗?但是如果我使用fork()或thread,我可以在子线程或子线程完成通信后关闭套接字。非常感谢您的评论。@zuhakasa,
select
将文件描述符(句柄)标记为准备读取或准备写入,或出现异常。如
man select
中所述,使用FD_ISSET查找
select
试图告诉您的内容。插座必须保持打开状态,直到您需要它进行通信,然后在不需要时或当另一侧关闭连接时关闭它。这与使用
fork
或线程的方式相同。