如题,请教各位了!
解决方案 »
- 第一次做项目,关于vc操作excel的
- 怎样把VCdata grid控件里的数据导入word表格!!!十分感谢高手指点!!
- 谁能帮我解决这个问题(50分)
- 各位大侠,怎样实现路径选择对话框:就象VC++中的那个choose Directory对话框一样。太难了。
- 创建窗口可不可以SDK和MFC一起用?
- 一个有关字符串输出各式的问题
- ***>>> 树形控件的数据怎么保存到Ini文件中? <<<***
- 为何access表中加入20多条纪录后就无法再添加,也不报错误!!紧急!!在线等
- VB中如何能调用到中断1CH
- 请教一个椭圆区域的抓图和贴图问题
- 问下谁有VC++游戏编程的网站(基础)
- 用MFC自己创建窗口一闪就自动退出
则可用下面代码获取:
char lpszIpAddr[16];
sprintf_s(lpszIpAddr, 16, "%d.%d.%d.%d", addr.sin_addr.S_un.S_un_b.s_b1, addr.sin_addr.S_un.S_un_b.s_b2, addr.sin_addr.S_un.S_un_b.s_b3, addr.sin_addr.S_un.S_un_b.s_b4);如果是想获取网卡收到的数据包的IP地址,建议还是用工具吧,很多的。Wireshark就很好用,也是基于Winpcap的。如果自己写代码实现有点麻烦。可以用RAW SOCKET,或者编写网卡过滤驱动。再查查资料吧
BOOL CDataSnifferDlg::InitSocket()
{
BOOL flag=TRUE;
m_socket=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);
if(INVALID_SOCKET==m_socket)
{
AfxMessageBox("创建套接字失败!");
return FALSE;
}
int setsock=setsockopt(m_socket, SOL_SOCKET,SO_REUSEADDR, (char*)&flag, sizeof(flag));
if(SOCKET_ERROR==setsock)
{
AfxMessageBox("设置套接字选项失败!");
return FALSE;
}
char strHostName[200];
HOSTENT* pHost;
gethostname(strHostName,sizeof(strHostName));
pHost=gethostbyname(strHostName);
sockaddr_in addr_in;
addr_in.sin_addr = *(in_addr *)pHost->h_addr_list[0]; //IP
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(57274);
if(SOCKET_ERROR==bind(m_socket,(SOCKADDR*)&addr_in,sizeof(SOCKADDR)))
{
AfxMessageBox("绑定失败!");
return FALSE;
}
DWORD dwValue = 1; ioctlsocket(m_socket, FIONREAD, &dwValue);
return TRUE;
}
然后在按钮响应函数中
char RecvBuf[65535];
IP ip;
TCP tcp;
while (true)
{
// 接收原始数据包信息
int ret = recv(m_socket, RecvBuf, 65535, 0);
if(ret==SOCKET_ERROR)
{
AfxMessageBox("接受数据失败!");
return;
}
……………………
其他代码略
}
请高手指点!
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
printf("1 ");
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||HIBYTE( wsaData.wVersion ) != 2 )
{
WSACleanup( );
printf("2");
} //加载套接字库
SOCKET m_sockCap = socket(AF_INET , SOCK_RAW , IPPROTO_IP);//创建原始套接字char name[65535];
err = gethostname(name, strlen(name));//获得主机名struct hostent FAR * pHostent;
pHostent = gethostbyname(name);//获得主机信息int m_nCapPort = 32768;
SOCKADDR_IN sa;
sa.sin_family = AF_INET;
sa.sin_port = htons(m_nCapPort);
memcpy(&sa.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length);
err = bind(m_sockCap, (PSOCKADDR)&sa, sizeof(sa));BOOL bopt=TRUE;
err = setsockopt(m_sockCap, SOL_SOCKET, SO_REUSEADDR, (char*)&bopt, sizeof(bopt));
bopt = TRUE;
err = setsockopt(m_sockCap, IPPROTO_IP, IP_HDRINCL, (char*)&bopt, sizeof(bopt));
DWORD dwBufferLen[10];
DWORD dwBufferInLen = 1;
DWORD dwBytesReturned = 0;
err = WSAIoctl(m_sockCap,
SIO_RCVALL,
&dwBufferInLen,
sizeof(dwBufferInLen),
dwBufferLen,
sizeof(dwBufferLen),
&dwBytesReturned,
NULL,
NULL);char recvBuf[65535];
int read=0;
while(1)
{
read=recv(m_sockCap, recvBuf ,341, 0);if (read > 0)
{
if(0x06==(int)recvBuf[9]);//第10位为6说明是tcp包,自己定义数据结构来判断是什么包。
//你所需要的信息就在recvBuf里面,
}
//以上代码在VC6环境编译通过
{
read=recv(m_sockCap, recvBuf ,341, 0);if (read > 0)
{
if(0x06==(int)recvBuf[9]);//第10位为6说明是tcp包,自己定义数据结构来判断是什么包。
//你所需要的信息就在recvBuf里面,
}
//以上代码在VC6环境编译通过
我前面和successful_cy的一样,但是到了这个循环的时候就卡住了,我把循环去掉,能收到一个数据包,但是加了个while,就收不到任何数据包