服务器如何确定哪个客户端在TCP套接字编程中发送了消息

时间:2016-12-18 09:00:07

标签: c sockets tcp

我们在项目中使用linux TCP套接字。服务器正在使用accept()调用等待连接请求,一旦来自客户端的连接请求到来,服务器就会创建一个线程,并且线程处理与客户端的进一步通信。任何人都可以告诉我,如果有任何方式服务器可以确定发送消息的客户端(进程ID)。

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

3 个答案:

答案 0 :(得分:2)

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

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

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

  

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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