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 *)&in;
    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
==================================================================

Reply via email to