讨论:通过代码关闭系统中的TCP连接。

l_clove 2003-05-28 05:07:37
最近看到一个名为eStop的软件,可以关闭系统中已建立的TCP连接,甚感迷惑,用了一天时间研究了一下,找到以下解决

方案,可以实现相似的功能,下面将设计思路列出,希望能和各位探讨一下:
首先是取得当前已建立的连接:
MIB_TCPTABLE *tcpTable=new MIB_TCPTABLE;
DWORD dwSize;
dwSize=sizeof(MIB_TCPTABLE);

GetTcpTable(tcpTable, &dwSize, true); //此处获取tcpTable的实际长度,在下面使用
delete tcpTable;
tcpTable=new MIB_TCPTABLE[dwSize/sizeof(MIB_TCPTABLE)];
DWORD getInfo=GetTcpTable(tcpTable, &dwSize, true); //获取系统中的TCP Table
if(NO_ERROR == getInfo)
{
for(DWORD i=0; i < tcpTable->dwNumEntries; i++)
{
//在此可遍历所有的连接
}
}
对于指定的连接可以通过LocalPort和RemotePort来确定,这两个参数位于tcpTable->table[i]结构体中,注意是以网络字节序保存的。
关闭指定的连接:

GetTcpTable(tcpTable, &dwSize, true);
delete tcpTable;
tcpTable=new MIB_TCPTABLE[dwSize/sizeof(MIB_TCPTABLE)];
DWORD getInfo=GetTcpTable(tcpTable, &dwSize, true);
if(NO_ERROR == getInfo)
{
for(DWORD i=0; i < tcpTable->dwNumEntries; i++)
{
if(LPort == htons(tcpTable->table[i].dwLocalPort) && RPort == htons(tcpTable->table[i].dwRemotePort))
{
TCPRow = new MIB_TCPROW;
* TCPRow = tcpTable->table[i];
TCPRow->dwState = MIB_TCP_STATE_DELETE_TCB;

if(NO_ERROR != SetTcpEntry(TCPRow)) //使用这个函数删除指定的连接
{
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
getInfo,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) & lpMsgBuf,
0,
NULL);
MessageBox(NULL, (LPCTSTR) lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION);
LocalFree(lpMsgBuf);
}
delete TCPRow;
break;
}
}
}
不知道各位有没有更好的办法,希望赐教!
...全文
71 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
warton 2003-05-29
  • 打赏
  • 举报
回复
有个叫tcpview的软件做的不错,可以关闭,网上可以找到代码

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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