vc 如何测试端口可用?

namewchwch 2010-08-04 09:57:33
我的思路是
测试TCP端口:
建立套接字和sockaddr_in
对sockaddr_in指定端口
绑定端口 //若失败则TCP端口不可用
对远程服务器连接 //所失败则TCP端口不可用
发送数据(send) //所失败则TCP端口不可用
接受数据 (recv) //所失败则TCP端口不可用

但有个问题,在connect的时候会阻塞,而我仅仅想知道端口可用否,没必要搞的像传输数据client/server 这么麻烦
请教下 有什么简单的方法测试端口可用?

PS: 对TCP测试 是否可以不进行连接 直接调用 sendto 和recvfrom 来收发数据?
...全文
739 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
houzy123 2010-08-05
  • 打赏
  • 举报
回复
我是这样用的,还算稳定
公司是这样要求的:网络正常,则开启指定远程服务器上的网页,否则开启本地的错误网页
BOOL CheckServer(const char *szSvr, UINT nPort)
{
CSocket sock;
if(!sock.Create())
return FALSE;
BOOL bOK = sock.Connect(szSvr,nPort);
sock.Close();
return bOK;
}

调用
if(!CheckServer(monitorDlg->m_pszHostIP, atoi(monitorDlg->m_pszHostPort)))
...
else
...
namewchwch 2010-08-05
  • 打赏
  • 举报
回复
有时候会被系统屏蔽 端口,或者屏蔽TCP通信 或者屏蔽UDP 单绑定貌似不能确定端口可用。

[Quote=引用 7 楼 lijianli9 的回复:]
可以的,如果绑定失败了,然后查看错误代码,如果是10048,说明端口已经在用,则说明端口已经被占用了
[/Quote]
w1881 2010-08-04
  • 打赏
  • 举报
回复
关注,此贴留名
dulvtianya 2010-08-04
  • 打赏
  • 举报
回复
楼主是想问tcp端口扫描??


于TCP协议是面向连接的,建立一个TCP连接需要进行“三次握手”,使得TCP端口扫描大多数是建立在对“三次握手”过程的试探上,根据利用的过程不同有下列三种TCP端口扫描方案:
 方案一:TCP Connect扫描
这是TCP端口扫描最基本的一种方式,通过Connect系统调用实现。这个系统调用尝试和目标机的一个指定端口通过“三次握手”建立连接。如果对方的端口处于侦听状态,也就是端口是开放的,那么连接的请求就会被通过,系统调用返回成功;如果这个端口不是关闭的,系统调用返回失败【15】。通过判断系统调用的返回值,就可以判断出对方端口的状态。
该方案的优点是实现这个方法不需要任何的系统权限,而且实现方法简单。可以通过使用多线程技术大大提升扫描速度。但缺点是很容易被探测到而且过滤掉【15】,同时对由于超时设置的时间比较长,花费的时间也较多。另外,某些路由器可能隐藏自己的IP,使用此方法就会得不到正确的结果。
 方案2:TCP SYN扫描
SYN扫描又称为“半成功”扫描,因为没有建立一个完整的TCP连接。SYN扫描就是通过本机的一个端口向对方指定的端口发送一个TCP的SYN连接建立请求数据报,然后就开始等待对方的应答。如果应答数据报中设置了SYN位和ACK位,那么这个端口是开放的;如果应答数据报是一个RST连接复位数据报,则对方的端口是关闭的【15】。使用这种方法不需要完成Connect系统调用所封装的建立连接的整个过程,而只是完成了其中有效的部分就可以达到端口扫描的目的。
此方案的优点是不容易被发现。扫描速度也比较快。同时通过对Mac地址的判断,可以对一些路由器进行端口扫描。缺点是需要系统管理员的权限。不适于使用多线程技术,因为在实现过程中需要自己完成对应答数据报的查找、分析,使用多线程容易发生数据报的串位现象,也就是原来应该这个线程接收的数据报被另一个线程接收,接收后,这个数据报就会被丢弃,而等待线程只好在超时之后再发送一个SYN数据报,等待应答。这样,所用的时间反而会增加。
 方案3:TCP FIN扫描
FIN扫描不依赖于TCP的“握手”过程。原理在于向一个TCP端口发送设置了FIN位的连接终止数据报,关闭的端口会回应一个设置了RST的连接复位数据报;而开放的端口则会对这种可疑的数据报不加理睬,也就是会将它丢弃【15】。于是可以根据是否收到RST数据报来判断对方的端口是否开放。
此方案优点是比前两种都要隐秘,不容易被发现。该方案有两个缺点:首先,要判断对方端口是否开放必须等待超时,增加了探测时间,而且容易得出错误的结论。其次,一些系统并没有遵循规定,最典型的就是Microsoft公司所开发的操作系统,这些系统一旦收到这样的数据报,无论端口是否开放都会回应一个RST连接复位数据报,本方案对于这类操作系统是无效的。



oyljerry 2010-08-04
  • 打赏
  • 举报
回复
你发送数据,也要对应的端口返回,不然不好判断是否端口在干嘛...
直接connect来判断一下好了,多线程异步方式
luodx1021 2010-08-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 msn123321 的回复:]
C/C++ code


//一种简单的实现:通过绑定端口来判断;
int testPort(unsigned short usPort)
{
long lIpAddrTest = InvalidIp;
unsigned short usPortTest = usPort;

long lSockTest = (long)socket(AF_INET, ……
[/Quote]
你这个方法还真值得考虑,可以测试一下。
lijianli9 2010-08-04
  • 打赏
  • 举报
回复
可以的,如果绑定失败了,然后查看错误代码,如果是10048,说明端口已经在用,则说明端口已经被占用了
namewchwch 2010-08-04
  • 打赏
  • 举报
回复
单绑定能确认一个端口是否能用吗?


[Quote=引用 5 楼 msn123321 的回复:]
C/C++ code


//一种简单的实现:通过绑定端口来判断;
int testPort(unsigned short usPort)
{
long lIpAddrTest = InvalidIp;
unsigned short usPortTest = usPort;

long lSockTest = (long)socket(AF_INET, ……
[/Quote]
V若只如初见 2010-08-04
  • 打赏
  • 举报
回复


//一种简单的实现:通过绑定端口来判断;
int testPort(unsigned short usPort)
{
long lIpAddrTest = InvalidIp;
unsigned short usPortTest = usPort;

long lSockTest = (long)socket(AF_INET, SOCK_STREAM, 0);
if(0 > lSockTest)
{
return -1;
}

//绑定本地地址
struct sockaddr_in serverAddr;
memset((char *)&serverAddr, 0, (long)sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = (unsigned long)lIpAddrTest;
serverAddr.sin_port = htons(usPortTest);
if (0 > bind ((SOCKET)lSockTest, (struct sockaddr *)&serverAddr, sizeof(serverAddr)))
{
(void)CLOSESOCK((UINT)lSockTest);
return -1;
}

(void)CLOSESOCK((UINT)lSockTest);

return 0;
};
namewchwch 2010-08-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dulvtianya 的回复:]
楼主是想问tcp端口扫描??


于TCP协议是面向连接的,建立一个TCP连接需要进行“三次握手”,使得TCP端口扫描大多数是建立在对“三次握手”过程的试探上,根据利用的过程不同有下列三种TCP端口扫描方案:
 方案一:TCP Connect扫描
这是TCP端口扫描最基本的一种方式,通过Connect系统调用实现。这个系统调用尝试和目标机的一个指定端口通过“三……
[/Quote]

请注意问题 不要随便复制黏贴


我问的是 如何确保自己的本地自己的机子上的端口(TCP UDP)开放了没 而不是扫描别人的机子。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧