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

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

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

 const static STDMETHODIMP GetPortState(ULONG nPort, ULONG *nStateID)
 {
  MIB_TCPTABLE TcpTable[100];
  DWORD nSize = sizeof(TcpTable);
  if(NO_ERROR == GetTcpTable(&TcpTable[0],&nSize,TRUE))
  {
   DWORD nCount = TcpTable[0].dwNumEntries;
   if (nCount > 0)
   {
    for(DWORD i=0;i<nCount;i++)
    {
     MIB_TCPROW TcpRow = TcpTable[0].table[i];
     DWORD temp1 = TcpRow.dwLocalPort;
     int temp2 = temp1 / 256 + (temp1 % 256) * 256;
     if(temp2 == nPort)
     {
      *nStateID = TcpRow.dwState;
      return S_OK;
     }
    }
   }
   return S_FALSE;
  }
  return S_FALSE;
 }


 const static BOOL PortUsedTCP(ULONG uPort)
 {
  MIB_TCPTABLE TcpTable[100];
  DWORD nSize = sizeof(TcpTable);
  if(NO_ERROR == GetTcpTable(&TcpTable[0],&nSize,TRUE))
  {
   DWORD nCount = TcpTable[0].dwNumEntries;
   if (nCount > 0)
   {
    for(DWORD i=0;i<nCount;i++)
    {
     MIB_TCPROW TcpRow = TcpTable[0].table[i];
     DWORD temp1 = TcpRow.dwLocalPort;
     int temp2 = temp1 / 256 + (temp1 % 256) * 256;
     if(temp2 == uPort)
     {
      return TRUE;
     }
    }
   }
   return FALSE;
  }
  return FALSE;
 }

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

转自 http://blog.csdn.net/cn_xinxin/article/details/2282801

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值