mfc要通过服务器名怎么抓包
我现在只知道服务器的名称,要怎么才能通过这个服务器名把对应的包都获取到?
[解决办法]
用SOCK_RAW原始套接字,能接收到发给本机网卡的IP协议包。
如果要获取更底层的协议包,那么用SOCKET编程就有点不灵了,要么用现成的网络数据包捕获库,要么自己写驱动来截获了。
这些是与网络编程相关的东西了,与MFC什么的没什么关系。
[解决办法]
一个软件wireshark就有你需要的功能。根据服务器的IP过滤一下就全有了。
如果你想自己写的话,就原始套接字,然后根据与服务器定的协议自己解析。
[解决办法]
int Downloadhttp::GetFile(const CString strUrl, const CString strSavePath)
{
//检查传入参数
if(strUrl.IsEmpty())
{
return -5;
}
if(strSavePath.IsEmpty())
{
return -6;
}
unsigned short nPort;//保存目标http服务端口
CString strServer,strObject;//strServer用于保存服务器地址,strObject用于保存文件对象名称
DWORD dwServiceType,dwRet;//dwServiceType用于保存服务类型,dwRet用于保存提交GET请求返回的状态号
//解析URL,获取信息
try{
AfxParseURL(strUrl,dwServiceType,strServer,strObject,nPort);
}
catch(CInternetException *pEX)
{
//解析失败
return -1;
}
//创建网络连接对象,HTTP连接对象指针和用于该链接的HTTPFile文件对象指针,注意delete
CInternetSession intsess;
CHttpFile *pHtFile=NULL;
CHttpConnection *pHtCon;
try{
pHtCon=intsess.GetHttpConnection(strServer,nPort);
}
catch(CInternetException *pEX)
{
//建立网络链接失败
intsess.Close();
return -2;
}
//发起GET请求
pHtFile=pHtCon->OpenRequest(CHttpConnection::HTTP_VERB_POST,strObject);
if(pHtFile==NULL)
{
//发起get请求失败
intsess.Close();
delete pHtCon;
pHtCon=NULL;
return -3;
}
//提交请求
pHtFile->SendRequest();
//获取服务器返回的状态号
pHtFile->QueryInfoStatusCode(dwRet);
if(dwRet!=HTTP_STATUS_OK)
{
//服务器不接受请求
intsess.Close();
delete pHtCon;
pHtCon=NULL;
delete pHtFile;
pHtFile=NULL;
return -4;
}
UINT nFileLen=(UINT)pHtFile->GetLength();
DWORD dwRead=1;//用于表示读了多少,为1是为了进入循环
//创建缓冲区
CHAR *szBuffer=new CHAR[nFileLen+1];
try
{
//创建文件
CFile PicFile(strSavePath,CFile::modeCreate
[解决办法]
CFile::modeWrite
[解决办法]
CFile::shareExclusive);
while(dwRead>0)
{
//清空缓冲区
memset(szBuffer,0,(size_t)(nFileLen+1));
//读取到缓冲区
dwRead=pHtFile->Read(szBuffer,nFileLen);
//写入到文件
PicFile.Write(szBuffer,dwRead);
}
//关闭文件
PicFile.Close();
//释放内存
delete []szBuffer;
delete pHtFile;
delete pHtCon;
//关闭网络连接
intsess.Close();
}
catch(CFileException e)
{
//释放内存
delete []szBuffer;
delete pHtFile;
delete pHtCon;
//关闭网络连接
intsess.Close();
return -7;//读写文件异常
}
return 0;
}