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

标签 c multithreading networking tcp

我刚刚开始学习网络概念。

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

谁能给我一张套接字、端口、线程的图示,这样我就清楚了。我读得越多,我就越困惑。

最佳答案

When a server receives a connection request, it can complete the connection by accepting the request.

A socket that has been established as a server can accept connection requests from multiple clients. The server's original socket does not become part of the connection; instead, accept makes a new socket which participates in the connection. accept returns the descriptor for this socket. The server's original socket remains available for listening for further connection requests.

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

编辑1:

tcp 服务器中的每个连接由 4 元组(serverip、serverport、destip、destport)区分。服务器监听相同的端口和 ip,当客户端从不同的 ip 或不同的端口连接时,它将是不同的连接。

在你的情况下:

  • 服务器监听 ip 10.10.62.5 端口 8888。
  • 两个客户端尝试使用端口 8990 和 8991 进行连接
  • 客户端 ip 不同,所以 tcp 服务器认为它是不同的连接。
  • 然后接受系统调用将接受客户端连接并将客户端连接路由到新的文件描述符以进行进一步操作。
  • pthread_create 将为新的处理程序分配新的客户端文件描述符。

编辑2:

从链接客户端程序中可用的代码可以看出,连接到服务器的 8888 端口。客户端也需要一个端口来连接服务器,你不是在程序中自己分配客户端的端口。客户端程序动态选择随机端口。这个随机端口将不同于 8888。通过使用这个随机端口客户端连接到服务器的 8888 端口。

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

关于c - 了解 c 中的多线程服务器/客户端程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21473799/

相关文章:

c# - Task.Delay() 和 new Task(()=>Thread.Sleep()) 的区别

ubuntu - 如何为玩具 MPI 集群配置静态 IP?

c++ - OpenCL header 包含在 C++ 中的相对路径问题

c - 使用指向 char 而不是 char 数组的指针时出错

c - 我怎样才能把这些数字放在上面?

c++ - clang 3.0 + libc++ 中的 std::async 不起作用?

java - 一个线程写数据不读,多线程读数据不写

networking - TCP-序列号环绕

node.js - 无法在 docker compose 服务之间连接到 Postgres 数据库

C 和 AVR pow 函数点亮 LED