您的位置:首页 > 编程语言

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

2015-12-22 14:39 573 查看
        一般检测一个端口是否被占用的方法是看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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  windows C++