如果我知道这个客户端已经连接到我的服务器上,那么如何接收只来自所需客户端的消息?
recvfrom(sockfd, buf, BUFFSIZE, MSG_PEEK,
(struct sockaddr *)&addr, &caddrlen);addr将被相应的数据替换,但我希望只从一个客户端接收数据。
发布于 2018-12-14 18:27:28
如果我知道这个客户端已经连接到我的服务器上,那么如何接收只来自所需客户端的消息?
AF_INET或AF_INET6系列中的数据报套接字并不能真正做到这一点,除非在较低级别(例如通过防火墙)阻塞不想要的客户端。至少,如果您希望能够在一个不想要的客户端到达后继续接收所需客户端的消息,则不会这样做。网络驱动程序为您排队数据报,您需要按顺序处理它们,其中用于“处理”数据报的calls将通过满足此目的的几个系统调用之一(如recvfrom() )接收数据报。
您可以在收到消息后对它们进行区分,例如从不想要的客户端丢弃这些消息。但是,正如MSG_PEEK标记recvfrom()所提供的那样,检索消息数据而不对其进行排队是有限的、特殊的用途。特别是,这不符合您所述的目的--您仍然需要通过不使用MSG_PEEK的后续呼叫接收每一条消息。相反,我建议通过recvfrom()读取数据,检查地址以确定它是否来自您感兴趣的客户端,并对其进行适当处理。
如果您想同时处理多个客户端,那么您有一些选择。一个相对简单的方法是有一个函数,可能在一个专用线程中运行,它接收所有传入的消息,并根据它们的源地址适当地分发它们。另一种选择是为每个客户端打开一个新的(数据报)套接字,每个客户端都在自己的端口上,并设置一个协议,通过该协议告诉每个客户端在第一次联系之后使用哪个端口。这些附加端口上来自意外客户端的数据报将是错误的,因此可以安全地拒绝。
当然,后者类似于面向连接的协议。如果它对您有吸引力,那么也许您应该看看流套接字,而不是数据报套接字。这不仅将使您不必大惊小怪的客户特性,它还将提供可靠和保证有序的通信。
发布于 2018-12-14 16:46:04
recvfrom(sockfd, buf, BUFFSIZE, MSG_PEEK,
(struct sockaddr *)&addr, &caddrlen);
if(addr.sin_addr.s_addr == "ADDRESS_OF_DESIRED_CLIENT")
{
//ALLOW USER
}对于IPV4,"addr.sin_addr.s_addr“是一个int,但您也可以从一个字符串中获取地址。
https://stackoverflow.com/questions/53783550
复制相似问题