[Winpcap-users] Pcap_list_datalinks return bad number of links.

Steve Beaudoin steve.a.beaudoin at gmail.com
Thu Aug 24 22:11:38 GMT 2006


You are absolutely right.  The received array was the wrong item of the two.
Following your suggestion, I changed my ref int[] for a ref IntPtr and I now
receive two items, the other one is DOCSIS (Data Over Cable Service
Interface Specifications, http://en.wikipedia.org/wiki/DOCSIS for those
interested) as I have a cable modem.

 

The lesson I learned is : Marshal everything that is not a single value
type, even if it seems to work... Or work partially. ^-^

 

Thank you.

 

  _____  

From: winpcap-users-bounces at winpcap.org
[mailto:winpcap-users-bounces at winpcap.org] On Behalf Of Gianluca Varenni
Sent: August 24, 2006 12:34
To: winpcap-users at winpcap.org
Subject: Re: [Winpcap-users] Pcap_list_datalinks return bad number of links.

 

I think that the marshalling you are doing with P/Invoke is wrong.

 

I haven't tried it myself, but you should probably

 

1. declare the dlt_buf parameter as "ref IntPtr" (or out IntPtr)

2. call pcap_list_datalinks

3. create a managed int array of size "result" 

4. use Marshal.Copy(
<ms-help://MS.MSDNQTR.2003OCT.1033/cpref/html/frlrfsystemintptrclasstopic.ht
m> IntPtr source,
<ms-help://MS.MSDNQTR.2003OCT.1033/cpref/html/frlrfsystemint32classtopic.htm
> int[] destination,
<ms-help://MS.MSDNQTR.2003OCT.1033/cpref/html/frlrfsystemint32classtopic.htm
> int startIndex,
<ms-help://MS.MSDNQTR.2003OCT.1033/cpref/html/frlrfsystemint32classtopic.htm
> int length) to copy from the unmanaged pointer dlt_buf to the managed int
array.

Have a nice day

GV

 

----- Original Message ----- 

From: Steve <mailto:steve.a.beaudoin at gmail.com>  Beaudoin 

To: winpcap-users at winpcap.org 

Sent: Thursday, August 24, 2006 5:32 AM

Subject: [Winpcap-users] Pcap_list_datalinks return bad number of links.

 

Hi,

 

            I am developing a winpcap library in C# with visual studio 2005
(and using the version 3.1 of winpcap) and the pcap_list_datalinks function
return the value 2, indicating the number of datalinks it found, but the
array return only one element.  

 

            I declared the import with this :

 

         // WinPCap : int pcap_list_datalinks(pcap_t *p, int **dlt_buf)

         [DllImport("wpcap.dll",CharSet=CharSet.Ansi)]

         internal extern static int pcap_list_datalinks(IntPtr pcapT, ref
int[] dlt_buf);

 

            And the code to retrieve the links is :

 

            IntPtr pcapT=OpenDevice(Target,Auth);

            int[] links=new int[] {};

            int result=NativeMethods.pcap_list_datalinks(pcapT,ref links); 

 

            The value return into result is 2, but the links array only have
one value (1 for Ethernet).

 

            The detailed information returned by ethereal for the same
network adapter (path : capture->interfaces->details) return only one media
supported (I suppose this is the name they use for datalink).

 

            I first thought it was because I used 32bits integer for my
array, but the symptoms are the same with 16bits bytes.

 

            So, either the returned value is wrong, or I'm missing a
datalink in my array, or I'm doing something wrong in the code.

 

            Someone have an idea before I dig into the winpcap source code?

 


  _____  


_______________________________________________
Winpcap-users mailing list
Winpcap-users at winpcap.org
https://www.winpcap.org/mailman/listinfo/winpcap-users

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.winpcap.org/pipermail/winpcap-users/attachments/20060824/776b14cc/attachment-0001.htm


More information about the Winpcap-users mailing list