Hi all,
I am using winpcap library to build a program for bridging two computers.
I want to communicate two computers using a third computer between them.
Third computer has two NICs and I capture data, coming from one computer,
change the ethernet address and then send to other computer.
I have built a prototype code for such functionality but right now it is
plain structured program. Because I am using pcap_loop for capturing data, I
have to use two instanced of program for both NICs.
Can anyone help me writing a multithreaded application to accomplish this
task.
My program is as follows:
Sorry for such a bad code but it is just a prototype, also contains copied
code from examples :-(
#include <pcap.h>
#include <win32-extensions.h>
#include <winsock.h>
#include "protoheaders.h"
#include "proc.h"
u_char * DataBuffer;
#define LINE_LEN 16
void ifprint(pcap_if_t *d);
char *iptos(u_long in);
void PrintPacket(struct pcap_pkthdr *Header, u_char *Packet);
void PacketHandler(u_char *Parm, const struct pcap_pkthdr *Header, const
u_char *PacketData);
pcap_t *pHandle;
pcap_t *pHandle1;
struct pcap_pkthdr *PacketHeader;
u_char *PacketData;
//////////////////////////////////////////////////////////////
int main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
char ErrBuf[PCAP_ERRBUF_SIZE+1];
if (pcap_findalldevs(&alldevs, ErrBuf) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs: %s\n",ErrBuf);
exit(1);
}
int i=0;
for(d=alldevs;d;d=d->next)
{
printf("%d. %s\n\t%s\n\n", ++i, d->name, d->description);
printf("%d. ",++i);
ifprint(d);
}
printf ("Enter The Interface Number to capture...");
int iNumber;
scanf("%d", &iNumber);
if (iNumber < 1 || iNumber > i)
{
printf("Invalid Interface Number");
pcap_freealldevs(alldevs);
return (-1);
}
d = alldevs;
for (i=0; i < iNumber-1;i++)
d = d->next;
printf("\nOpening Frist Adapter......");
if ( (pHandle1 = pcap_open_live(d->name, 65536, 1,1000, ErrBuf)) == NULL)
{
fprintf(stderr, "\n%s", ErrBuf);
pcap_freealldevs(alldevs);
return -1;
}
else
printf("\nFirst Adpater Opened");
d = d->next;
printf("\n\nOpening Second Adapter.....");
if ( (pHandle = pcap_open_live(d->name, 65536, 1,1000, ErrBuf)) == NULL)
{
fprintf(stderr, "\n%s", ErrBuf);
pcap_freealldevs(alldevs);
return -1;
}
else
printf("\nSecond Adapter Opened");
printf("\nListening on %s.....\n", d->description);
pcap_freealldevs(alldevs);
pcap_loop(pHandle1, 0, got_packet, NULL);
return 1;
}
////////////////////////////////////////////////////////////////////////
void PrintPacket(struct pcap_pkthdr *Header, u_char *Packet)
{
struct tm *lTime;
char TimeStr[16];
u_int i=0;
lTime = localtime( &Header->ts.tv_sec );
strftime(TimeStr, sizeof(TimeStr), "%H:%M:%S", lTime);
printf("%s, %.6d len:%d\n", TimeStr, Header->ts.tv_usec, Header->len);
printf("%ld:%ld (%ld)\n", Header->ts.tv_sec, Header->ts.tv_usec,
Header->len);
for (i=1; (i < Header->caplen + 1 ) ; i++)
{
printf("%.2x ", Packet[i-1]);
if ( (i % LINE_LEN) == 0 )
printf("\n");
}
printf("\n\n");
}
/////////////////////////////////////////////////////////////////////
// Header ID = 0 for Ethernet, 1 for IP, 2 for TCP, 3 for ICMP
//
void * HeaderExtract(u_char * Packet, u_char HeaderID=0)
{
static int count = 1;
const EthernetHeader *Ether;
const IPHeader * ipHead;
const struct sniff_tcp *tcp;
int iEthSize;
int iIPSize;
int size_tcp = sizeof(struct sniff_tcp);
Ether = (EthernetHeader*)(Packet);
iEthSize = sizeof(EthernetHeader);
ipHead = (IPHeader*)(Packet + 14);
iIPSize = (ipHead->ver_ihl & 0xf) * 4;
tcp = (struct sniff_tcp*)(Packet + iEthSize + iIPSize);
if (HeaderID == 0)
{
return (void *)Ether;
}
else if (HeaderID == 1)
{
return (void *)ipHead;
}
else if (HeaderID == 2)
{
return (void *)tcp;
}
return (void *)Ether; // By default return Ethernet Address
}
/////////////////////////////////////////////////////////////////////
// CALLBACK FUNCIOTN FOR PACKET CAPTURE
void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char
*packet)
{
u_char EtherAddr[20];
PacketHeader = (pcap_pkthdr *) malloc(sizeof(pcap_pkthdr));
memcpy(PacketHeader,header,sizeof(pcap_pkthdr));
PacketData = (u_char *) malloc(header->caplen);
memcpy(PacketData, packet,header->caplen);
PrintPacket(PacketHeader, PacketData);
/*
memcpy(EtherAddr,(u_char *)HeaderExtract(PacketData,0), 14);
printf("%.2x", EtherAddr);
*/
u_char * TempPacket;
char * Source = "00:00:c0:2d:d0:ee";
char * Dest = "00:00:c0:92:cb:ee";
TempPacket = (u_char *)malloc(header->caplen);
memcpy(TempPacket,packet,header->caplen);
ChangeMAC(TempPacket,Source, Dest);
pcap_sendpacket(pHandle, TempPacket, header->caplen);
printf("\n\n");
}
////////////////////////////////////////////////////////////////////
void ifprint(pcap_if_t *d)
{
pcap_addr_t *a;
printf("%s\n",d->name);
if (d->description)
printf("\tDescription: %s\n",d->description);
printf("\tLoopback: %s\n",(d->flags & PCAP_IF_LOOPBACK)?"yes":"no");
for(a=d->addresses;a;a=a->next) {
printf("\tAddress Family: #%d\n",a->addr->sa_family);
switch(a->addr->sa_family)
{
case AF_INET:
printf("\tAddress Family Name: AF_INET\n");
if (a->addr)
printf("\tAddress: %s\n",iptos(((struct sockaddr_in
*)a->addr)->sin_addr.s_addr));
if (a->netmask)
printf("\tNetmask: %s\n",iptos(((struct sockaddr_in
*)a->netmask)->sin_addr.s_addr));
if (a->broadaddr)
printf("\tBroadcast Address: %s\n",iptos(((struct sockaddr_in
*)a->broadaddr)->sin_addr.s_addr));
if (a->dstaddr)
printf("\tDestination Address: %s\n",iptos(((struct sockaddr_in
*)a->dstaddr)->sin_addr.s_addr));
break;
default:
printf("\tAddress Family Name: Unknown\n");
break;
}
}
printf("\n");
}
/////////////////////////////////////////////////////////////
#define IPTOSBUFFERS 12
char *iptos(u_long in)
{
static char output[IPTOSBUFFERS][3*4+3+1];
static short which;
u_char *p;
p = (u_char *)∈
which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
sprintf(output[which], "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
return output[which];
}
==================================================================
This is the WinPcap users list. It is archived at
http://www.mail-archive.com/[email protected]/
To unsubscribe use
mailto: [EMAIL PROTECTED]?body=unsubscribe
==================================================================