读书人

怎么搜索局域网内打开某个端口主机

发布时间: 2012-02-26 20:19:45 作者: rapoo

如何搜索局域网内打开某个端口主机?
小弟想实现诸如CS,WAR3那样的局域网链接形式:
游戏启动后,会自动搜索局域网内的主机显示出来,用户可以选择加入一个主机
现在的思路这样的:游戏主机一直打开某个端口监听。想加入游戏的客户机在局域网内发一个广播包,询问是否有主机打开某个特定端口(如10000);将收到的应答机器IP显示出来,用户选择加入某个ip地址的主机时,与该主机10000端口长链接开始游戏。
于是我查找资料,想用ICMP协议来做,在局域网内发一个255.255.255.255目的地址的广播包。局域网内的主机收到这个包就会回一个应答包。但问题是不能指定特定的端口。
请问大家有什么更好的思路吗?提供源码最好!


[解决办法]
不用ICMP,直接connect到10000,连的上就表示可以玩。

CS一般是要某一台当主机建立游戏的,建立游戏后可以监听XX端口,
其它机器扫描网络的时候,凡是xx端口打开并经过确认,就是该主机建立了游戏。
[解决办法]
依次连接同一子网内的每个机器的指定端口,能连上,说明该主机开了该端口。
也可以使用多个线程同时连接不同主机。
[解决办法]
网络黑客经常是扫描某个网段范围内的所有ip。
CS之类应该是有广播。
[解决办法]
是UDP广播。
(魔兽和CS应该是UDP广播)
[解决办法]
哈哈,抢分来了

毕业时的课程设计 代码里正好有 开255个线程 同时扫描 端口 经测试十分可靠, 3秒内返回所有 指定端口的存活主机。
头文件:
/*
扫描局域网活动主机端口类 LanActiveHost
*/
#include <winsock.h>
#pragma comment(lib, "ws2_32.lib")

class LanActiveHost
{
public:
//建议线程 不超过200 毫秒超时设置 最好大于1秒 小于1秒结果不可靠
LanActiveHost(short _MaxThread,short _Port,DWORD _TimeOutValue);
~LanActiveHost();
BOOL GetHostIP();
BOOL GetIP3();
BOOL InitIPList();
static BOOL Try3_ConnSelect(fd_set r,struct timeval tm);
static BOOL Try3_SendSelect(fd_set r,struct timeval tm);
static BOOL Try3_RecvSelect(fd_set r,struct timeval tm);

static BOOL CFG_DP();
static BOOL Chk_ServMsg(int id);
static BOOL SetMsgRec(BOOL flag,int id);

static DWORD WINAPI DoScanPort(LPVOID lpParam);
static DWORD WINAPI StartScan(LPVOID lpParam);
static BOOL GetServerMSG(char ServerMsg[256][34]);
BOOL StartListServer();
BOOL EndListServer();
BOOL Get_IPIndex(char ip[256][16],char index[256]);


private:
HANDLE Handle; //父线程句柄
static DWORD TimeOutValue ; //连接超时时间,以ms计
static short ThreadCount; //当前正在扫描的进程数
static short Port; //端口
static char IP[256][16]; //局域网IP列表
static char Index[256]; //局域网活动服务器 是1 否0

static char send_str[5]; //发送数据缓存
static char recv_str[256][40]; //接收数据缓存
static int send_len;
static int recv_len;

static char RecvMsg[256][34]; //收到每个主机返回的信息 32 GSP 1 Num

short MaxThread; //最大允许的扫描线程数,不宜大于200
char HostIP[16]; //本机IP
char IP3[16]; //IP前3段
};

读书人网 >C++

热点推荐