如何在C++中创建一个只有两个客户端的简单服务器?

3
我需要创建一个服务器,允许一次只有一个客户端连接。 规则是仅允许一个客户端连接,如果其他客户端尝试连接,则会看到如下消息:“已经有另一个客户端连接,是否要断开它?”。 然后,如果输入“yes”,该客户端将会被断开连接。
我的问题在于这一步:如何断开一个客户端并连接另一个客户端? 有人可以帮忙吗?
谢谢。

您可以通过关闭套接字或使用“shutdown”系统调用来断开套接字连接。如果您已经成功向另一个客户端发送了消息,则表示您已经连接到该客户端,因此您的问题不太清楚。请问您具体遇到了什么编码问题? - Mat
2个回答

0

首先构建抽象服务器结构。编写一个程序,在一个线程中接受TCP连接并将其传递给工作线程,工作线程可以读取和发送消息。

您应该保留一个Singleton,其中包含对当前连接的客户端的Worker的引用(或指针,由您选择)(如果没有人连接,则为null)。

为了简单起见,接受器线程应该在每次接受连接时创建一个新的Worker线程,并且当连接断开时,Worker线程将被终止。

现在您必须考虑协议。对于这个简单的任务,5条消息应该足够了。也许每个消息都以endl结尾,因此如果C++中有类似readline的方法,则可以使用它们。

首先是CONNECT消息。如果没有人连接到服务器,则服务器应返回OK(第二条消息),如果已经有一个连接,则返回ERROR(第三条消息)。

第四条消息是CONNECTWITHDISCONNECT,它将客户端连接到服务器并断开任何其他客户端。新连接的客户端应从服务器接收到OK消息,而断开连接的客户端应接收到DISCONNECT(第五条消息)。

现在,您可以使用断开消息与客户端一起使用,这样一个人就可以断开连接,而不需要另一个人连接。
如果客户端收到错误,则应首先发送CONNECT,然后它可以要求用户断开其他客户端的连接,如果用户愿意,则客户端发送CONNECTWITHDISCONNECT

1
好的,非常有用的答案。 但是对于线程,我应该使用fork还是pthread? 哪个更适合这个目标? 谢谢。 - user840718
抱歉,我不太了解C ++,我是一名Java程序员。但从我的计算机词汇知识来看,我猜测您需要的是pthread,因为fork让我想起了分叉/合并,这是一个并行化大型任务的概念,与正常Web服务器需要处理的问题无关。 - Sibbo

0
另一个选项(如果您不想处理多个线程或多个进程)是在单个线程中使用select()或poll()来同时处理多个套接字。特别地,您可以对接受套接字进行select()-for-read操作,当另一个客户端尝试连接时,select()将返回并标记该套接字为ready-for-read。一旦您accept()了客户端,您可以将客户端的连接套接字(就像accept()返回的那样)传递给select()的read-sockets-set,这样您也会在客户端的套接字有可读字节时收到通知。以此类推。

我已经编写了一些功能的服务器,现在我使用send和recv来传递消息,并使用fork()来实现多客户端。不过,使用poll也是可能的吗? - user840718

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接