~cpp
int _cdecl main(int argc, char **argv)
{
SOCKET s;
WSADATA wsd;
SOCKADDR_IN if0;
int ret,
count;
unsigned int optval;
DWORD dwBytesRet,
dwFlags,
nproc;
char rcvbuf[MAX_IP_SIZE];
WSABUF wbuf;
// Load Winsock
//
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("WSAStartup() failed: %d\n", GetLastError());
return -1;
}
// Parse the command line
//
ValidateArgs(argc, argv);
if (bFilter)
{
printf("Source Port: %d\n", usSourcePort);
printf("Dest Port: %d\n", usDestPort);
}
// Create a raw socket for receiving IP datagrams
//
s = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED);
if (s == INVALID_SOCKET)
{
printf("WSASocket() failed: %d\n", WSAGetLastError());
return -1;
}
// Get an interface to read IP packets on
//
if (GetInterface(s, &if0, dwInterface) != 0)
{
printf("Unable to obtain an interface\n");
return -1;
}
printf("Binding to IF: %s\n", inet_ntoa(if0.sin_addr));
//
// This socket MUST be bound before calling the ioctl
//
if0.sin_family = AF_INET;
if0.sin_port = htons(0);
if (bind(s, (SOCKADDR *)&if0, sizeof(if0)) == SOCKET_ERROR)
{
printf("bind() failed: %d\n", WSAGetLastError());
return -1;
}
//
// Set the SIO_RCVALLxxx ioctl
//
optval = 1;
if (WSAIoctl(s, SIO_RCVALL, &optval, sizeof(optval),
NULL, 0, &dwBytesRet, NULL, NULL) == SOCKET_ERROR)
{
printf("WSAIotcl(%d) failed; %d\n", dwIoControlCode,
WSAGetLastError());
return -1;
}
// Start receiving IP datagrams until interrupted
//
count = 0;
while (1)
{
wbuf.len = MAX_IP_SIZE;
wbuf.buf = rcvbuf;
dwFlags = 0;
ret = WSARecv(s, &wbuf, 1, &dwBytesRet, &dwFlags, NULL, NULL);
if (ret == SOCKET_ERROR)
{
printf("WSARecv() failed: %d\n", WSAGetLastError());
return -1;
}
// Decode the IP header
//
}
// Cleanup
//
closesocket(s);
WSACleanup();
return 0;
}
상기와 같이 기존의 서버 프로그램과 다른 점은 별로 없다. (Listen과 accept가 없네요.
WSAIoctrl에서 다 처리하는건지...) 단지 소켓을 ioctrl 로 조정해서 ip 수준에서 올라오는 패킷을 기존과 다르게 처리할 뿐이다.
SIO_RCVALL 을 통해서 NIC를 통해 올라오는 모든 패킷의 캡쳐가 가능하다. NIC를 통해 나가는 패킷을 캡쳐하지 못하는 듯 하다.
아마도 listen, accept 가 패킷 필터링을 하는 것으로 보이는데 dst 상관없이 무조겁 application 까지 올라오니깐 필요없는 것이 아닐까? 그런 생각하고 있음.
-
eternalbleu