如何通过只知道局域网中的端口号来检测客户端程序的服务器程序ip?

时间:2015-09-05 12:25:34

标签: c winsock winsock2

我是一名尝试在c学习winsock编程的新手。请告诉我是否可以进行以下操作。 对不起,如果问题很愚蠢。但我真的想知道答案。

我正在尝试一个客户端程序,它可以搜索网络中只有指定端口号的相关服务器。客户端必须找到在指定端口提供服务的IP,然后将该ip检索回客户端程序。所有这些都在同一系统或LAN中。

我的一位朋友说我必须在客户端的第一部分使用多播DNS或UDP来获取ip。获得ip后,我可以创建与服务器的tcp连接。

是否真的可以通过udp将客户端ip发送到服务器并启动从服务器到客户端的tcp连接。 我有一个基本的想法是什么多播DNS。但我不够精通在实时程序中使用它。

任何人都可以告诉我必须使用哪些winsock2命令进行这些操作????? 对不起,如果我对你的眼睛很傻。

2 个答案:

答案 0 :(得分:2)

  

我的一位朋友说我必须在客户端的第一部分使用多播DNS或UDP来获取ip。获得ip后,我可以创建与服务器的tcp连接。

您的朋友所指的内容通常使用UDP子网广播来实现。客户端将UDP消息发送到特定端口上的LAN子网的广播IP地址。 IF 服务器与客户端位于同一子网上,并且 IF 它正在侦听该UDP端口,它将收到该消息并可以将响应发送回客户端发送消息的IP /端口。当客户端收到该响应时,它将知道服务器的IP,然后可以连接到服务器的TCP端口。

另一个选项是 IF 服务器使用Multicast定期广播其TCP IP /端口。客户端可以加入组播组,接收广播的IP /端口,然后连接到它。

  

是否真的可以通过udp

将客户端ip发送到服务器

是,通过向给定端口上的整个子网发送UDP广播消息。监听该UDP端口的所有计算机都将收到相同的消息,并可以选择忽略它或响应它。

  

并启动从服务器到客户端的tcp连接。

客户端仍然必须启动与服务器的连接。广播只允许客户端发现服务器的IP而无需寻找它。

  

任何人都可以告诉我必须使用哪些winsock2命令进行这些操作吗?

IF 服务器可以响应UDP广播,客户端可以使用sendto()WSASendTo()发送广播,然后使用recvfrom()或{ {1}}收到回复。使用WSARecvFrom()GetAdaptersInfo()发现LAN的子网广播IP地址。必须提前知道广播端口。

IF 服务器使用多播广播其IP,客户端可以使用GetAdaptersAddresses()setsockopt(IP_ADD_MEMBERSHIP)加入多播组,然后使用setsockopt(MCAST_JOIN_GROUP)或{ {1}}接收广播。

当然,在任何一种方法中,必须提前知道广播消息的实际格式。

并且 IF 服务器不支持这两种方法,您将不得不求助于子网的手动暴力扫描。给定客户端分配的IP地址和子网掩码(同样可以从recvfrom()WSARecvFrom()获得),您可以轻松计算子网的第一个和最后一个IP地址,然后连接到每个TCP端口找到服务器之前的子网IP地址。

答案 1 :(得分:-2)

是的,有可能...... 看看你需要做的是在你特定端口的网络中广播初始请求(应该是什么响应,你必须知道...有点像握手)。现在,无论哪种设备都会以这种方式响应,您都会知道......

以这样的方式制作服务器,对于初始请求,它将使用它的IP和详细信息进行回复......

如果你在同一个局域网,那么只有它是可能的。