18,363
社区成员




SOCKET s = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
if (INVALID_SOCKET == s)
{
printf("create socket fail --- %d\n", WSAGetLastError());
return 0;
}
DWORD flag;
setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&flag, sizeof(flag));
char szName[200];
::gethostname(szName, 199);
hostent *pHost = ::gethostbyname(szName);
if (pHost == NULL)
{
printf("get local host address fail --- %d\n", WSAGetLastError());
return 0;
}
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr = *(struct in_addr *)pHost->h_addr_list[0];
addr.sin_port = htons(57727);
if (SOCKET_ERROR == ::bind(s, (sockaddr *)&addr, sizeof(addr)))
{
printf("bind socket fail --- (%d)\n", WSAGetLastError());
return 0;
}
u_long iMode = 1;
ioctlsocket(s, SIO_RCVALL, &iMode);
char buf[65535];
int iRevLen = 0;
while(1)
{
iRevLen = ::recv(s, buf, 65534, 0);
filter(buf, iRevLen);
}
#include "stdio.h"
#include "string.h"
#include "Winsock2.h"
#include <ws2tcpip.h>
#include "mstcpip.h"
#include "time.h"
#pragma comment(lib,"WS2_32.lib")
int main(int argc, char **argv)
{
SOCKET SnifferSocket;
int Result;
char Packet[60000];
char Name[255];
WSADATA wsaData;
DWORD dwBufferLen[10];
DWORD dwBufferInLen = 1;
DWORD dwBytesReturned = 0;
struct hostent *pHostent;
Result = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (Result == SOCKET_ERROR)
{
printf("WSAStartup failed with error %d\n", Result);
return 0;
}
SnifferSocket = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
if (Result == SOCKET_ERROR)
{
printf("socket failed with error %d\n", WSAGetLastError());
closesocket(SnifferSocket);
return 0;
}
Result = gethostname(Name, 255);
if (Result == SOCKET_ERROR)
{
printf("gethostname failed with error %d\n", WSAGetLastError());
closesocket(SnifferSocket);
return 0;
}
pHostent = (struct hostent*)malloc(sizeof(struct hostent));
pHostent = gethostbyname(Name);
SOCKADDR_IN sock;
sock.sin_family = AF_INET;
sock.sin_port = htons(0);
memcpy(&sock.sin_addr.S_un.S_addr, pHostent->h_addr_list[2], pHostent->h_length);//2?
printf("\n ip addr is %s\n",inet_ntoa(sock.sin_addr));
Result = bind(SnifferSocket, (PSOCKADDR) &sock, sizeof(sock));
if (Result == SOCKET_ERROR)
{
printf("bind failed with error %d\n", WSAGetLastError());
closesocket(SnifferSocket);
return 0;
}
// Result = WSAIoctl(SnifferSocket, SIO_RCVALL, &dwBufferInLen, sizeof(dwBufferInLen),
// &dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned, NULL, NULL);
Result =ioctlsocket(SnifferSocket, SIO_RCVALL, &dwBufferInLen);
if (Result == SOCKET_ERROR)
{
printf("WSAIoctl failed with error %d\n", WSAGetLastError());
closesocket(SnifferSocket);
return 0;
}
// HANDLE hCon= GetStdHandle(STD_OUTPUT_HANDLE);
//CONSOLE_SCREEN_BUFFER_INFO bInfo;
//GetConsoleScreenBufferInfo(hCon, &bInfo);
int packetcount = 0;
struct sockaddr_in from;//rendb
int fromlen ;//rendb
time_t temp;
while (true)
{
memset(Packet, 0, sizeof(Packet));
// Result = recv(SnifferSocket, Packet, sizeof(Packet), 0);
fromlen=sizeof(from);
Result = recvfrom(SnifferSocket, Packet, sizeof(Packet), 0,(struct sockaddr*)&from,&fromlen);//WSAEINTR
if (Result == SOCKET_ERROR)
{
printf("recv failed with error %d\n", WSAGetLastError());
closesocket(SnifferSocket);
return 0;
}
packetcount++;
time(&temp);
printf("Packet:%d Length:%d Time:%s from %s\n", packetcount, Result,
ctime(&temp),inet_ntoa(from.sin_addr));
if (packetcount==70) break;
}
// SetConsoleTextAttribute(hCon, bInfo.wAttributes);
if (closesocket(SnifferSocket) == SOCKET_ERROR)
{
printf("closesocket failed with error %d\n", WSAGetLastError());
return 0;
}
if (WSACleanup() == SOCKET_ERROR)
{
printf("WSACleanup failed with error %d\n", WSAGetLastError());
return 0;
}
return 1;
}
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr = *(struct in_addr *)pHost->h_addr_list[0];
addr.sin_port = htons(57727);
if (SOCKET_ERROR == ::bind(s, (sockaddr *)&addr, sizeof(addr)))