【问题标题】:How the server determines which client sent the message in TCP socket programmingTCP socket编程中服务器如何判断是哪个客户端发送消息的
【发布时间】:2016-12-18 09:00:07
【问题描述】:

我们在我们的项目中使用 linux TCP 套接字。服务器正在使用 accept() 调用等待连接请求,一旦来自客户端的连接请求到来,服务器就会创建一个线程,该线程将处理与客户端的进一步通信。谁能告诉我服务器是否可以确定发送消息的客户端(进程ID)。

如果有任何消息来自驱动程序,我们的服务器会将该消息广播给所有客户端。在该领域的一个错误中,UI 挂起,UI 团队抱怨他们没有收到消息。但是我们看到了日志,并且我们正在向所有附加的客户端广播。所以我们只是想证明我们正在向哪个进程 ID 发送消息。

【问题讨论】:

  • 为什么?知道客户端的进程 ID 有什么好处?
  • 只有当客户端和父节点都在同一主机上运行并且在同一主机上使用服务器和客户端没有用时,您才能这样做'
  • @Anjaneyulu 不正确。如果客户端都在同一主机上运行,​​则客户端的进程 ID 是唯一的,但它不必与服务器是同一主机。但是,进程 ID 没有任何用处,除了作为唯一标识符。
  • @Anjaneyulu: "..在同一个主机中使用服务器和客户端是没有用的.." - 真的吗?同一主机上的客户端和服务器实际上有很多用途,例如连接到本地数据库,http://localhost,...
  • @Anjaneyulu 我们在同一台机器上运行。如果您知道任何此类方法,请告诉我。

标签: c sockets tcp


【解决方案1】:

不,您只有客户端的 IP 地址和源端口。在大多数情况下,这不足以识别客户。如果您在 LAN 中的所有客户端或通常它们的 IP 地址都是可区分的(它们具有唯一的公共/私有地址),您可以使用客户端的 IP 地址,但对于经过 NAT 的客户端,它们的 IP 地址将是相同的。 请注意,即使您有客户端的 IP 地址,它也可以用于区分客户端,它不会报告客户端进程 id 或与客户端相关的任何动态内容。

您必须实现一个协议,所有客户端都将其身份信息发送到服务器,以便服务器知道它们。进程 ID 或与客户端相关的任何内容都可以通过您的协议发送。

【讨论】:

    【解决方案2】:

    客户端可能在远程计算机上,因为您使用的是 TCP,所以我不确定如何知道“进程 ID”。

    可以找到的是客户端的 IP 和 TCP 端口号:

    http://pubs.opengroup.org/onlinepubs/7908799/xns/accept.html

    空指针或指向 sockaddr 结构的指针 将返回连接套接字的地址。

    【讨论】:

    • 我们在同一台机器上运行。
    • 好的,但是 TCP 旨在处理本地和远程连接。您可以做的是如 e.jahandar 建议的那样实现一个协议以在连接时发送pid。或者,如果您使用的是 Windows 并且不关心可移植性,请使用命名管道和 GetNamedPipeClientProcessId
    【解决方案3】:

    您可以在每次向服务器发送消息时连接客户端的 PID,以便您可以识别发送消息的客户端。即将客户端的 PID 添加到消息的固定位置,或者在末尾或在服务器代码中开始和解码相同。 在这种情况下,我真诚的建议是在 Linux 环境中使用 select API,以便它监视所有文件描述符。在这里,您可以根据唯一的文件描述符来识别客户端。因此可能会解决您的问题 看看here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-12
      • 2013-04-29
      • 2023-03-03
      • 2017-05-03
      • 1970-01-01
      • 2013-11-10
      • 2013-04-24
      • 2019-12-06
      相关资源
      最近更新 更多