如下代码,为什么捕获不到本机发出的包。
比如,我打开个网页,或用Outlook发邮件,应该有发出去的包啊,为什么只能捕获收到包,而没有捕获发出的包。
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) m_s = socket( AF_INET , SOCK_RAW , IPPROTO_IP ) ; sa.sin_family = AF_INET;
sa.sin_port = htons(7000);
sa.sin_addr.s_addr= m_iLocalIP;
bind(m_s,(PSOCKADDR)&sa, sizeof(sa)) == SOCKET_ERROR) WSAIoctl( m_s, SIO_RCVALL , &dwBufferInLen, sizeof(dwBufferInLen),
&dwBufferLen, sizeof(dwBufferLen),
&dwBytesReturned , NULL , NULL ) ) recv( pDlg->m_s , buf , sizeof( buf ) , 0 ) ;
比如,我打开个网页,或用Outlook发邮件,应该有发出去的包啊,为什么只能捕获收到包,而没有捕获发出的包。
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) m_s = socket( AF_INET , SOCK_RAW , IPPROTO_IP ) ; sa.sin_family = AF_INET;
sa.sin_port = htons(7000);
sa.sin_addr.s_addr= m_iLocalIP;
bind(m_s,(PSOCKADDR)&sa, sizeof(sa)) == SOCKET_ERROR) WSAIoctl( m_s, SIO_RCVALL , &dwBufferInLen, sizeof(dwBufferInLen),
&dwBufferLen, sizeof(dwBufferLen),
&dwBytesReturned , NULL , NULL ) ) recv( pDlg->m_s , buf , sizeof( buf ) , 0 ) ;
recv只适用于TCP这样的带连接的协议。
s.sin_family = AF_INET;
s.sin_port = htons(4000);//随便指定个端口?
s.sin_addr.s_addr = inet_addr("192.168.120.33");//本机地址?
int iLen = sizeof(s);
iRet = recvfrom( pDlg->m_s, buf, sizeof( buf ), 0, (sockaddr*)&s, &iLen) ;
怎样解决?
注意:你捕获(recv)的是你收到的包。
WSADATA WSAData;
struct sockaddr_in addr_in;
char LocalName[16];
struct hostent *pHost;
long len;
char recvBuf[MAX_PACK_LEN];
CString string;
bool IsNewIP = false; //检查 Winsock 版本号
if (WSAStartup(MAKEWORD(2, 2), &WSAData) != 0)
AfxMessageBox("WSAStartupFailed!");
//初始化 Raw Socket
if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == INVALID_SOCKET)
AfxMessageBox("socketFailed!");
//if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag)) == SOCKET_ERROR)
// AfxMessageBox("setsockoptFailed!");
//设置IP头操作选项
if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag)) == SOCKET_ERROR)
//获取本机名
if (gethostname((char*)LocalName, sizeof(LocalName)-1) == SOCKET_ERROR)
AfxMessageBox("gethostnameFailed!"); //获取本地 IP 地址
if ((pHost = gethostbyname((char*)LocalName)) == NULL)
AfxMessageBox("gethostbynameFailed!"); addr_in.sin_addr = *(in_addr *)pHost->h_addr_list[0]; //IP
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(10000); //把 sock 绑定到本地地址上
if (bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in)) == SOCKET_ERROR)
AfxMessageBox("bindFailed!"); DWORD dwValue = 1;
//设置 SOCK_RAW 为SIO_RCVALL,以便接收所有的IP包
if (ioctlsocket(sock, SIO_RCVALL, &dwValue) != 0)
AfxMessageBox("ioctlsocketFailed!"); CString SrcIP,DestIP,SrcPort,DestPort,TotalLen;
int read;
while(flag)
{
read = recv(sock, recvBuf , MAX_PACK_LEN, 0);
if(read==SOCKET_ERROR)
{
string.Format("%d",read) ;
AfxMessageBox(string);
//flag = false;
}
else
if(read>0)
{