许多服务器可以在一个插槽上与一个客户端通信吗

时间:2012-01-10 05:17:18

标签: c sockets networking network-programming

在客户端:

    int clientSocketFD;
    if ((clientSocketFD = socket (PF_INET, SOCK_STREAM, 0)) == -1)
    {
        perror ("socket (): ");
        exit (1);
    }

客户端是一个,服务器很多。每次新服务器需要连接到同一客户端时,是否必须发出socket()系统调用?

请解释为什么。

2 个答案:

答案 0 :(得分:7)

是的 - 每个连接需要一个套接字。

套接字是客户端IP地址+客户端端口+服务器IP地址+服务器端口组合。如果客户端正在与多个服务器通信,则它在客户端计算机上使用多个端口。

每次连接()套接字时,都要分配一个新端口。

您可以通过bind()指定要使用的客户端端口 - 端口号。否则,操作系统会为您选择一个端口。这被称为“短暂”端口。

如果服务器正在与多个客户端通信,则通过调用accept()为每个客户端创建一个套接字。

我记得的一个类比:

想象一下,你有一个住在里面的很多人的公寓楼。公寓前面有可供使用的邮箱。

公寓楼对应一台计算机,公寓里的人对应计算机上运行的程序,邮箱是端口。每个端口一次只能由一个应用程序用作其私有/输出框。

套接字是一个建筑物上的单个邮箱与另一个建筑物上的单个邮箱之间的链接。它是“到”和“从”地址。套接字API使用套接字来了解数据包的发送位置以及要在数据包上放置的回复地址。套接字甚至可以链接同一建筑物上的两个邮箱。

计算机上的单个应用程序可能正在使用许多端口,甚至可能连接到同一远程计算机上的同一端口。因此,需要套接字信息(两个连接的机器上的IP地址+端口)以消除目标和返回地址上的任何歧义。

同样,单台计算机上的多个应用程序可能会连接到同一服务器上的同一端口并发送请求,但服务器会将其响应发送到正确的应用程序,因为返回地址具有不同的端口号。

套接字在两台通信机器上具有相同的4条信息。

在Web服务器的客户端/服务器通信中,许多客户端连接到一个服务器端口。所以套接字看起来都像{client(n)IP,client(n)port,server IP,server port 80}。

正如@DavidGelhar所说,理论上可以让多个服务器与客户端上的同一端口进行通信,因为套接字信息指定了要发送到的正确服务器地址。但是,您无法多次连接()单个端口。服务器可以全部connect()到同一个客户端端口,但是它们不能再被称为服务器:)

基本上,套接字只是一个4件式数据结构,套接字API使用它来知道将数据发送到何处,以及将数据放在哪个返回地址上。同样,“端口”只是一个用作目标机器上特定应用程序的地址的数字,它绝不是实际的硬件对象。

答案 1 :(得分:2)

TCP / IP(SOCK_STREAM使用)是客户端和服务器之间的1对1连接。您需要为要创建的每个新连接进行新的socket()调用。