有本書提供的代碼,不過我沒有編譯的過去.
#include "stdio.h"
//#include "mswsock.h"
//#include "winsock.h"
#include "winsock2.h"
//#include "afxsock.h"
//#include "SOCKIMPL.H"
//#include "resource.h"
//#include
#include "header.h"
#define INTERFACE "eth0"
//*Prototype area*/
int Open_Raw_Socket(void);
int Set_Promisc(char *interface,int sock);
int main()
{
int sock,bytes_recieved,fromlen;
char buffer[65535];
struct sockaddr_in from;
struct ip *ip;
struct tcp *tcp;
sock = Open_Raw_Socket();
Set_Promisc(INTERFACE, sock);
while(1)
{
fromlen = sizeof from;
bytes_recieved = recvfrom(sock, buffer, sizeof buffer, 0, (struct sockaddr *)&from, &fromlen);
printf("/nBytes received ::: %5d/n",bytes_recieved);
printf("Source address ::: %s/n",inet_ntoa(from.sin_addr));
ip = (struct ip *)buffer;
//*See if this is a TCP packet*/
if(ip->ip_protocol == 6)
{
printf("IP header length ::: %d/n",ip->ip_length);
printf("Protocol ::: %d/n",ip->ip_protocol);
tcp = (struct tcp *)(buffer + (4*ip->ip_length));
printf("Source port ::: %d/n",ntohs(tcp->tcp_source_port));
printf("Dest port ::: %d/n",ntohs(tcp->tcp_dest_port));
}
}
}
int Open_Raw_Socket()
{
int sock;
if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0)
{
//*Then the socket was not created properly and must die*/
perror("The raw socket was not created");
exit(0);
};
return(sock);
}
int Set_Promisc(char *interface, int sock)
{
struct ifreq ifr;
strncpy(ifr.ifr_name, interface,strnlen(interface)+1);
if((ioctl(sock, SIOCGIFFLAGS, &ifr) == -1))
{
//*Could not retrieve flags for the interface*/
perror("Could not retrive flags for the interface");
exit(0);
}
printf("The interface is ::: %s/n", interface);
perror("Retrieved flags from interface successfully");
ifr.ifr_flags |= IFF_PROMISC;
if (ioctl (sock, SIOCSIFFLAGS, &ifr) == -1 )
{
//*Could not set the flags on the interface */
perror("Could not set the PROMISC flag:");
return(0);
}
printf("Setting interface ::: %s ::: to promisc", interface);
return(0);
}