织梦CMS - 轻松建站从此开始!

罗索

如何在Socket编程中检测端口是否被占用

落鹤生 发布于 2012-06-06 15:26 点击:次 
一般检测一个端口是否被占用的方法是看bind是否成功,但感觉上这个方法有点不合适,其实在Windows中有两个API可以获取到当前系统端口的占用情况(GetTcpTable/GetUdpTable),利用这两个函数就可检测端口占用情况。
TAG:

这是在我的另一博客发的一表文章,做了一点修改

环境:Windows+VC

最近看到BBS上有些朋友在讨论Socket的端口占用检测问题,就顺便整理一下我在这方面的经验,希望能给需要的朋友有所帮助。(可参考http://community.csdn.net/Expert/topic/5136/5136754.xml?temp=.3932154

一般检测一个端口是否被占用的方法是看bind是否成功,但感觉上这个方法有点不合适,其实在Windows中有两个API可以获取到当前系统端口的占用情况(GetTcpTable/GetUdpTable),利用这两个函数就可检测端口占用情况。

以下分别是TCP和UDP的检测方法:

  1. const static STDMETHODIMP GetPortState(ULONG nPort, ULONG *nStateID) 
  2.  { 
  3.   MIB_TCPTABLE TcpTable[100]; 
  4.   DWORD nSize = sizeof(TcpTable); 
  5.   if(NO_ERROR == GetTcpTable(&TcpTable[0],&nSize,TRUE)) 
  6.   { 
  7.    DWORD nCount = TcpTable[0].dwNumEntries; 
  8.    if (nCount > 0) 
  9.    { 
  10.     for(DWORD i=0;i<nCount;i++) 
  11.     { 
  12.      MIB_TCPROW TcpRow = TcpTable[0].table[i]; 
  13.      DWORD temp1 = TcpRow.dwLocalPort; 
  14.      int temp2 = temp1 / 256 + (temp1 % 256) * 256; 
  15.      if(temp2 == nPort) 
  16.      { 
  17.       *nStateID = TcpRow.dwState; 
  18.       return S_OK; 
  19.      } 
  20.     } 
  21.    } 
  22.    return S_FALSE; 
  23.   } 
  24.   return S_FALSE; 
  25.  } 
  26.  
  27.  
  28.  const static BOOL PortUsedTCP(ULONG uPort) 
  29.  { 
  30.   MIB_TCPTABLE TcpTable[100]; 
  31.   DWORD nSize = sizeof(TcpTable); 
  32.   if(NO_ERROR == GetTcpTable(&TcpTable[0],&nSize,TRUE)) 
  33.   { 
  34.    DWORD nCount = TcpTable[0].dwNumEntries; 
  35.    if (nCount > 0) 
  36.    { 
  37.     for(DWORD i=0;i<nCount;i++) 
  38.     { 
  39.      MIB_TCPROW TcpRow = TcpTable[0].table[i]; 
  40.      DWORD temp1 = TcpRow.dwLocalPort; 
  41.      int temp2 = temp1 / 256 + (temp1 % 256) * 256; 
  42.      if(temp2 == uPort) 
  43.      { 
  44.       return TRUE; 
  45.      } 
  46.     } 
  47.    } 
  48.    return FALSE; 
  49.   } 
  50.   return FALSE; 
  51.  } 

当然,如果在较复杂系统环境下,端口占用表可能随时改变,可能存在两个以上进程使用上述方法检测到同一空闲端口,在这种情况下,就可结合Bind方法进行端口选择。

(cn_xinxin)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201206/16065.html]
本文出处:CSDN博客 作者:cn_xinxin 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
相关文章
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容