理解c中的多线程服务器/客户端程序

理解c中的多线程服务器/客户端程序,c,multithreading,networking,tcp,C,Multithreading,Networking,Tcp,我刚刚开始学习网络概念 在这个多线程服务器/客户机中,最后编写了用于服务器处理多个连接的代码。我的问题是服务器如何处理同一套接字上的多个连接&端口8888。一个套接字一次只能在一个端口上接受一个客户端,线程通过创建pthread_create在其中扮演什么角色 有没有人能给我一个插座、端口、螺纹的图示,让我看得更清楚。我读得越多,就越糊涂 当服务器收到连接请求时,它可以通过接受请求来完成连接 已建立为服务器的套接字可以接受来自多个客户端的连接请求。服务器的原始套接字不会成为连接的一部分;相反,a

我刚刚开始学习网络概念

在这个多线程服务器/客户机中,最后编写了用于服务器处理多个连接的代码。我的问题是服务器如何处理同一套接字上的多个连接&端口8888。一个套接字一次只能在一个端口上接受一个客户端,线程通过创建pthread_create在其中扮演什么角色

有没有人能给我一个插座、端口、螺纹的图示,让我看得更清楚。我读得越多,就越糊涂

当服务器收到连接请求时,它可以通过接受请求来完成连接

已建立为服务器的套接字可以接受来自多个客户端的连接请求。服务器的原始套接字不会成为连接的一部分;相反,accept生成一个参与连接的新套接字。accept返回此套接字的描述符。服务器的原始套接字仍可用于侦听进一步的连接请求

在使用accept连接新客户机的情况下,为特定客户机创建新的文件描述符。pthread_使用此客户端文件描述符创建新线程并执行其工作

编辑1:

tcp服务器中的每个连接由4-tupleserverip、serverport、Destinp、destport区分。服务器在相同的端口和ip上侦听,当客户端从不同的ip或不同的端口连接时,它将是不同的连接

就你而言:

在ip 10.10.62.5端口8888上侦听的服务器。 尝试使用端口8990和8991连接的两个客户端 客户端IP不同,因此TCP服务器将其视为不同的连接。 然后,accept系统调用将接受客户端连接,并将客户端连接路由到新的文件描述符以进行进一步操作。 pthread_create将为新处理程序分配新的客户端文件描述符。 编辑2:

从linkclient程序中可用的代码可以看出,连接到服务器的8888端口。客户端还需要一个端口来连接服务器,您不能在程序中自行分配客户端的端口。客户端程序动态选择随机端口。此随机端口将不同于8888。通过使用此随机端口,客户端可以连接到服务器的8888端口

所以服务器和客户端端口将不同,这将是一个不同的连接。使用wireshark捕获数据包,然后进行分析以获得更多澄清

当服务器收到连接请求时,它可以通过接受请求来完成连接

已建立为服务器的套接字可以接受来自多个客户端的连接请求。服务器的原始套接字不会成为连接的一部分;相反,accept生成一个参与连接的新套接字。accept返回此套接字的描述符。服务器的原始套接字仍可用于侦听进一步的连接请求

在使用accept连接新客户机的情况下,为特定客户机创建新的文件描述符。pthread_使用此客户端文件描述符创建新线程并执行其工作

编辑1:

tcp服务器中的每个连接由4-tupleserverip、serverport、Destinp、destport区分。服务器在相同的端口和ip上侦听,当客户端从不同的ip或不同的端口连接时,它将是不同的连接

就你而言:

在ip 10.10.62.5端口8888上侦听的服务器。 尝试使用端口8990和8991连接的两个客户端 客户端IP不同,因此TCP服务器将其视为不同的连接。 然后,accept系统调用将接受客户端连接,并将客户端连接路由到新的文件描述符以进行进一步操作。 pthread_create将为新处理程序分配新的客户端文件描述符。 编辑2:

从linkclient程序中可用的代码可以看出,连接到服务器的8888端口。客户端还需要一个端口来连接服务器,您不能在程序中自行分配客户端的端口。客户端程序动态选择随机端口。此随机端口将不同于8888。通过使用此随机端口,客户端可以连接到服务器的8888端口


所以服务器和客户端端口将不同,这将是一个不同的连接。使用wireshark捕获数据包,然后进行分析以获得更多澄清。

就像您被困在服务器端,不清楚服务器端的accept功能是什么一样

所以 accept函数应提取挂起连接队列上的第一个连接,创建与指定套接字具有相同套接字类型协议和地址系列的新套接字,并为该套接字分配新的文件描述符

accept函数采用以下参数:

插座: 指定使用套接字创建的套接字,该套接字已使用bind绑定到地址,并已发出成功的侦听调用

地址: 空指针或指向sock的指针 addr结构,其中应返回连接插座的地址

地址: 指向socklen_t结构,该结构在输入时指定提供的sockaddr结构的长度,在输出时指定存储地址的长度

因此,虽然服务器IP和服务器端口在所有接受的连接中都是恒定的,但客户端信息使它能够跟踪所有内容的去向

比如说

假设我们有一个192.168.1.1:80的服务器和两个客户端171.0.0.1和171.0.0.2

171.0.0.1在本地端口1234上打开连接并连接到服务器。现在,服务器有一个套接字,标识如下:

171.0.0.1:1234 - 192.168.1.1:80
171.0.0.1:1234 - 192.168.1.1:80
171.0.0.2:5678 - 192.168.1.1:80
现在171.0.0.2在本地端口5678上打开连接并连接到服务器。现在,服务器有两个套接字,标识如下:

171.0.0.1:1234 - 192.168.1.1:80
171.0.0.1:1234 - 192.168.1.1:80
171.0.0.2:5678 - 192.168.1.1:80

在服务器端,为不同的客户端连接返回不同的描述符。

就像您停留在服务器端,不清楚在服务器端接受的功能是什么一样

所以 accept函数应提取挂起连接队列上的第一个连接,创建与指定套接字具有相同套接字类型协议和地址系列的新套接字,并为该套接字分配新的文件描述符

accept函数采用以下参数:

插座: 指定使用套接字创建的套接字,该套接字已使用bind绑定到地址,并已发出成功的侦听调用

地址: 空指针或指向sockaddr结构的指针,其中应返回连接套接字的地址

地址: 指向socklen_t结构,该结构在输入时指定提供的sockaddr结构的长度,在输出时指定存储地址的长度

因此,虽然服务器IP和服务器端口在所有接受的连接中都是恒定的,但客户端信息使它能够跟踪所有内容的去向

比如说

假设我们有一个192.168.1.1:80的服务器和两个客户端171.0.0.1和171.0.0.2

171.0.0.1在本地端口1234上打开连接并连接到服务器。现在,服务器有一个套接字,标识如下:

171.0.0.1:1234 - 192.168.1.1:80
171.0.0.1:1234 - 192.168.1.1:80
171.0.0.2:5678 - 192.168.1.1:80
现在171.0.0.2在本地端口5678上打开连接并连接到服务器。现在,服务器有两个套接字,标识如下:

171.0.0.1:1234 - 192.168.1.1:80
171.0.0.1:1234 - 192.168.1.1:80
171.0.0.2:5678 - 192.168.1.1:80

在服务器端,为不同的客户端连接返回不同的描述符。

这就是典型的服务器行为

我们将套接字绑定到一个接口,这个接口可以是一个特定的接口,也可以是所有接口

Accept是阻塞调用,它接受客户端请求,返回新的sockfd供您处理请求

您可以在有界套接字上看到netstat结果,也可以在服务器侦听套接字上看到LISTEN、RECV、SEND计数

是的,所有客户端套接字都连接到服务器绑定的接口上

您的客户端套接字文件描述符总数有限制

要增加客户端数量,可以设置ulimit

因此,除了服务器绑定的套接字之外,还将为每个客户端消息处理创建N个套接字

浏览一下netstat输出


netstat-antp->用于tcp指定输出。

这就是典型的服务器行为

我们将套接字绑定到一个接口,这个接口可以是一个特定的接口,也可以是所有接口

Accept是阻塞调用,它接受客户端请求,返回新的sockfd供您处理请求

您可以在有界套接字上看到netstat结果,也可以在服务器侦听套接字上看到LISTEN、RECV、SEND计数

是的,所有客户端套接字都连接到服务器绑定的接口上

您的客户端套接字文件描述符总数有限制

要增加客户端数量,可以设置ulimit

因此,除了服务器绑定的套接字之外,还将为每个客户端消息处理创建N个套接字

浏览一下netstat输出


netstat-antp->用于tcp输出。

Sujin:是的,我知道accept返回表示客户机套接字的套接字描述符。但服务器如何在其套接字描述符上接受多个客户机。假设服务器套接字描述符是socket\u desc是5678,两个客户端的套接字描述符是8990和8991。这意味着服务器desc 5678同时连接到客户端8990和8991,并且也连接到同一端口8888上。这怎么可能?我无法理解。您要从两个不同的源端口连接客户端,所以它将是不同的连接如何2个不同的连接?我想你对数字感到困惑。5678是服务器描述符,8990和8991是客户端描述符而不是端口。在HTONS888中使用的端口是8888。我仍然不知道使用线程的目的是什么,它实际上是做什么的
ike fork意味着它将创建一个新的子进程,但是这个子进程与父程序共享相同的地址空间。因此,我们称它为进程而不是线程。是这样吗?多个客户端如何通过不同的端口连接。在客户端程序中,它清楚地提到了8888@ShikharDeep您没有为客户端分配任何端口号,它是动态分配的。客户端说连接到10.10.62.4的8888端口。Sujin:是的,我知道accept返回代表客户端套接字的套接字描述符。但服务器如何在其套接字描述符上接受多个客户端。假设服务器套接字描述符是socket\u desc是5678,两个客户端的套接字描述符是8990和8991。这意味着服务器desc 5678同时连接到客户端8990和8991,并且也连接到同一端口8888上。这怎么可能?我无法理解。您要从两个不同的源端口连接客户端,所以它将是不同的连接如何2个不同的连接?我想你对数字感到困惑。5678是服务器描述符,8990和8991是客户端描述符而不是端口。在HTONS888中使用的端口是8888。我还不知道使用线程的目的是什么,它实际上是做什么的。pthread_create就像fork一样,意味着它将创建一个新的子进程,但是这个子进程与父程序共享相同的地址空间。因此,我们称它为进程而不是线程。是这样吗?多个客户端如何通过不同的端口连接。在客户端程序中,它清楚地提到了8888@ShikharDeep您没有为客户端分配任何端口号,它是动态分配的。客户端说连接到10.10.62.4的8888端口。171.0.0.2如何在不同的端口5678上打开连接。根据链接中给出的程序。在这种情况下使用端口888。因此,我在新终端中打开的所有客户端,因为我在本地主机上同时运行服务器和客户端,将使用888。您指定了服务器端口和客户端端口没有不同,但在服务器和客户端一上的程序中,它的888如何171.0.0.2在不同的端口5678上打开连接。根据链接中给出的程序。在这种情况下,它使用端口888。因此,我在新的终端中打开的所有客户端,因为我在本地主机上同时运行服务器和客户端,将使用888。您指定了吗服务器端口和客户机端口没有区别,但在服务器和客户机上的程序都是8888