2012-02-07 133 views
1

我在C和Linux中实现了TCP套接字服务器。它将是一个同时处理多个请求的聊天服务器。下面是它是如何设置C/Linux TCP套接字服务器

create a socket 
bind to a well-known port 
use listen to place in passive mode 
while (1) 
{ 
    accept a client connection 
    fork 
    if (child) 
    { 
     communicate with new socket 
     close new socket 
     exit 
    } 
else 
{close new socket} 
} 

从我所看到的伪代码中,“新窝沟通”部分包括读取缓冲区,然后可能写入缓冲区,然后插座关闭。我认为套接字被认为是一个持久的连接?如果客户端每次想要向服务器发送更多数据时都必须重新连接,这是否是低效的并且会影响套接字的目的?

+1

是你的功课吗? – 2012-02-07 10:36:41

+1

你应该使用诸如libevent或libev之类的事件库。 – 2012-02-07 11:42:42

+0

您不需要为每个客户端“分叉”。你很可能需要一个围绕多路复用系统调用的事件循环,比如'select'或'poll'(或者一个带有事件循环的库,比如'libev'或'libevent'或者别的东西;并且这个库会执行多路复用)。 – 2012-02-07 12:30:04

回答

2
  1. 请勿关闭插座。将接收和响应消息的代码放在一个循环中,并使用阻塞I/O(缺省值)在读取套接字时阻塞,直到请求到达。通过这种方式,您将拥有一个处理每个客户端并使用最少资源的分叉进程。您只关闭套接字并在客户端显式关闭连接时退出子进程,因为它已完成。

  2. 使用UDP而不是TCP。这样服务器和客户端之间就没有“连接”。您将多个客户端多路复用到一个套接字而不分叉。如果您关心可靠性,您需要为每条消息添加一个序列号以保持它们的直线性,并允许在发生故障时进行重新传输。

  3. 保留使用TCP的单个进程,但存储套接字描述符集并使用select检查可读的套接字。然后,您可以在每个或某些其他客户端套接字上重新传输该数据。

我想指出,在聊天服务器中为每个客户端分派一个孩子似乎是一个糟糕的实现。两个想聊天的人如何交流?每个人都将通过一个独立的流程进行服务 - 流程如何相互通信,以便聊天数据可以在客户端之间传递?

+0

“如果你关心可靠性,你需要为每条消息添加一个序列号,以保持它们的直线性,并允许在发生故障时重新传输。“< - 这叫做TCP ... – m0skit0 2012-02-07 10:58:24

+0

2.如果你需要可靠性,甚至不要考虑使用UDP,除非你有非常充分的理由这样做(有一些用例,但这是相当先进的水平) – 2012-02-07 10:59:43

+0

在需要大量速度和无法识别的情况下使用UDP,例如管理共享多人游戏的客户端的服务器。如果使用TCP,则数据包流速缓慢,因此反应速度很慢。用于广播信息 – Eregrith 2012-02-07 11:13:45

3

如果客户端每次要将更多数据发送到服务器时都需要重新连接,是不是这样低效并且会影响套接字的目的?

这是不可能不知道更多关于你的应用程序的性质,说:

  • 在某些情况下,它是有道理的,以保持对客户的生命周期内的持久连接。

  • 在其他情况下,连接每条消息也会很好。

你在效率方面是非常正确的:在建立TCP连接时存在相当多的开销。因此,如果消息频繁出现,为每条消息设置新的连接可能会非常昂贵。