请问如何获得TCP/IP相关信息

hadron 2002-01-31 05:07:31
在proxy服务器上,如何获得通过该proxy服务器访问Internet的每个用户/计算机的TCP/IP链接的建立/终止时间,以及本次链接的数据流入/流出量?
我想在TCP/IP包中应该有源/目的地的IP地址,这样可以确定这个包属于那个用户/计算机,从而也可以知道链接建立/终止时间;类似可以获得一个包所携带的数据流入/流出量。我不知道怎么获得这些源/目的地IP地址、时间、数据量,还有关键的是不知道怎么截取这个TCP/IP包,以及截取分析之后再转发。请高手们指点,或者提供能查到相应资料的地方。非常感谢!
...全文
96 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hadron 2002-02-21
  • 打赏
  • 举报
回复
谢谢wwwsq和众位高手。
wwwsq 2002-02-01
  • 打赏
  • 举报
回复
注意,这个程序不能用在98或95下,因为系统不支持SIO_RCVALL参数
2000和XP都是可以的
wwwsq 2002-02-01
  • 打赏
  • 举报
回复
void CIpMonDlg::OnStart()
{
this->GetProfile();

int l = (long)this->m_hWnd;

if(m_sock != INVALID_SOCKET)
OnStop();

m_sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
if(m_sock == INVALID_SOCKET)
{
::ReportError();
return;
}

int rcvtimeo = 5000 ; // 5 sec insteadof 45 as default
if( setsockopt( m_sock , SOL_SOCKET , SO_RCVTIMEO , (const char *)&rcvtimeo , sizeof(rcvtimeo) ) == SOCKET_ERROR)
{
::ReportError();
return ;
}

sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
if(m_strIP == "")
{
MIB_IPADDRTABLE* pTable = new MIB_IPADDRTABLE[100];
u_long len = sizeof(MIB_IPADDRTABLE) * 100;
if(GetIpAddrTable(pTable, &len, TRUE) != NO_ERROR)
{
int error = ::GetLastError();
::ReportError();
return;
}
CString strIP;
int num = pTable->dwNumEntries - 1;
for(; num>=0; num--)
{
in_addr in;
in.S_un.S_addr = pTable->table[num].dwAddr;
strIP = inet_ntoa(in);
if(!strIP.IsEmpty() && strIP != "127.0.0.1")
this->m_strIP = strIP;
}
delete[] pTable;
}
if(m_strIP == "")
{
AfxMessageBox("无法取得本机IP地址");
closesocket(m_sock);
m_sock = INVALID_SOCKET;
return;
}
addr.sin_addr.S_un.S_addr = inet_addr(m_strIP);
int error = bind(m_sock, (sockaddr*)(&addr), sizeof(addr));
if(error != 0)
{
::ReportError();
return;
}

//u_long arg;
//ioctlsocket(m_sock, FIONBIO, &arg);
DWORD ddd = SIO_RCVALL;
DWORD dwBufferLen[10] ;
DWORD dwBufferInLen= 1 ;
DWORD dwBytesReturned = 0 ;
if( SOCKET_ERROR == WSAIoctl( m_sock, SIO_RCVALL , &dwBufferInLen, sizeof(dwBufferInLen),
&dwBufferLen, sizeof(dwBufferLen),
&dwBytesReturned , NULL , NULL ) )
{
::ReportError();
return;
}


((CIpMonApp*)AfxGetApp())->g_bToRecv = 1;
m_pThread = AfxBeginThread((AFX_THREADPROC)ReadIPDataProc, (LPVOID)m_sock);
}
111222 2002-02-01
  • 打赏
  • 举报
回复
截取就是read and write
111222 2002-02-01
  • 打赏
  • 举报
回复
监听就是read-only
jie
hadron 2002-02-01
  • 打赏
  • 举报
回复
to wwwsq:
请问怎么监听原始IP数据包,监听和截取的区别在哪儿?谢谢
startsun 2002-01-31
  • 打赏
  • 举报
回复
可以自己写一个驱动程序来拦截数据。但非常麻烦,还要NAT。
wwwsq 2002-01-31
  • 打赏
  • 举报
回复
拦截数据是比较麻烦的。
如果只是监听原始IP数据包,这是很容易的。
关键字:SOCK_RAW,RCV_ALL

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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