[Winpcap-users] Winpcap and Sockets

Gianluca Varenni gianluca.varenni at cacetech.com
Wed Mar 28 17:15:28 GMT 2007


Ian,

I briefly tried your application (machine A) on my machine, and it worked 
without any problem. The call to bind didn't fail. Attached you can find the 
Visual Studio project I used (i just modified one of the samples of the 
WpdPack). I used VC 2003 to compile it.

Can you please try the attached project and see if it works?

GV



----- Original Message ----- 
From: "Ian Basham" <ianb at proconex.com>
To: <winpcap-users at winpcap.org>
Sent: Wednesday, March 21, 2007 7:28 AM
Subject: [Winpcap-users] Winpcap and Sockets


> Here are 2 programs that demonstrate a problem I am having.
>
> In a nutshell, normally the program on Machine B can be run over and over 
> without any problems.  However, if the program on Machine A calls 
> pcap_open and pcap_close, then the program on Machine B can never 
> re-establish the socket, because the program on Machine A fails on the 
> call to bind.
>
>
> On Machine A, run this program.
>
>
>
> #include "pcap.h"
> #include <winsock2.h>
>
> /*************************************************************
>
>    Name:      hst3002
>
>    Desc:      This routine shutdowns and closes the socket.
>
>    Returns:   nothing
>
>
> **************************************************************/
>
> void hst3002 ( SOCKET Socket ) {
>
>    int status;
>
>    status = shutdown (Socket, 2);
>    if (status == SOCKET_ERROR)    printf("shutdown failed\n");
>
>    status = closesocket (Socket);   if (status == SOCKET_ERROR) 
> printf("closesocket failed\n");
>
>    status = WSACleanup();
>    if (status == SOCKET_ERROR) printf("WSACleanup failed\n");
>
> }
>
> /*************************************************************
>
>    Name:      hst3001
>
>    Desc:      This routine:
>                   creates a socket
>                   sets up a socket name / address
>                   associates the address with the socket
>
>    Returns:   0 if successful.
>               1 if fails
>
> **************************************************************/
>
> SOCKET hst3001 (unsigned short port) {
>
>    WSADATA     Data;
>    SOCKADDR_IN SockAddr;
>    SOCKET      Socket;
>    SOCKADDR_IN hostSockAddr;
>    SOCKET      hostSocket;
>    int addrLen = sizeof (SOCKADDR_IN);
>
>    int status;
>
>    /* start Windows Socket dll */
>    status= WSAStartup (MAKEWORD(1,1), &Data);
>    if (status != 0) {
>        return (SOCKET_ERROR);
>    }
>
>    /* zero the socket address */
>    memset (&SockAddr, 0, sizeof (SockAddr));
>
>    /* set the socket name */
>    SockAddr.sin_port = htons(port);
>    SockAddr.sin_family = AF_INET;
>    SockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
>
>    /* create the socket */
>    Socket = socket(AF_INET, SOCK_STREAM, 0);
>    if (Socket == INVALID_SOCKET) {
>        printf("socket failed\n");
>        status = WSACleanup();
>        return (SOCKET_ERROR);
>    }
>
>    /* associate the socket with the address */
>    status = bind(Socket, (LPSOCKADDR) &SockAddr, sizeof(SockAddr));
>    if (status == SOCKET_ERROR) {
>        printf("bind failed\n");
>        return (SOCKET_ERROR);
>    }
>
>    /* allow the socket to take a connection */
>    status = listen (Socket, 1);
>    if (status == SOCKET_ERROR) {
>        printf("listen failed\n");
>        return (SOCKET_ERROR);
>    }
>
>
>    /* accept a connectio request */
>    hostSocket= accept(Socket, (LPSOCKADDR) &hostSockAddr, &addrLen);
>    if (hostSocket == INVALID_SOCKET) {
>        return (SOCKET_ERROR);
>    }
>
>    return (hostSocket);
>
> }
>
>
> void main(void)
> {
>
>    int     ei_mlen;                 /* message length (input)       */
>    int     numsnt;
>    unsigned short port = 44965;
>
>    unsigned char ei_imsg[200];
>
>    char errbuf[PCAP_ERRBUF_SIZE];
>
>    // you will need to put your own source here
>    char *src = "\\Device\\NPF_{1A61C83D-0286-4DFF-BEC5-BFC85EBBC765}";
>
>    SOCKET      hostSocket;
>
>    pcap_t *hnd_pcap = NULL;
>
>
>  // if these next 2 lines are commented out,
> // program works as expected
>    hnd_pcap = pcap_open_live(src, 1514, 0, 10, errbuf);
>    pcap_close(hnd_pcap);
>
>
>
>    hostSocket = hst3001 (port);
>
>    while (1) {
>
>        ei_mlen = recv (hostSocket, ei_imsg, 200, 0);
>        if ((ei_mlen == 0) || (ei_mlen == SOCKET_ERROR)) {
>            hst3002 ( hostSocket );
>            hostSocket = hst3001 (port);
>        }
>
>                Sleep(100);
>
>        // just echoing message back
>        numsnt= send(hostSocket, ei_imsg, ei_mlen, 0);
>        if (numsnt != ei_mlen) {
>            hst3002 ( hostSocket );
>            hostSocket = hst3001 ( port );
>        }
>    }
> }
>
>
> On Machine B, run this program.
>
> #include <stdio.h>
> #include <windows.h>
> #include <winsock.h>
>
> #define MAXBUFLEN 2048
>
> void main(void)
> {
>    unsigned short port = 44965;
>    unsigned long qtr;
>    int lenrcv;
>    int status;
>
>    unsigned char tbuffer [MAXBUFLEN];
>
>    struct hostent *serverHostent;
>   SOCKADDR_IN destSockAddr;
>   SOCKET destSocket;
>   WSADATA Data;
>
>    status = WSAStartup (MAKEWORD(1, 1), &Data);
>    if (status != 0)    printf("WSAStartup unsuccessful\n");
>
>
>        // you will have to put the name of your host here
>    serverHostent = gethostbyname ("LCNSIM");
>    if  (serverHostent == 0) printf("error in finding host\n");
>
>    memcpy(&destSockAddr.sin_addr, serverHostent->h_addr, 
> serverHostent->h_length);
>    destSockAddr.sin_port = htons(port);
>    destSockAddr.sin_family = AF_INET;
>
>    destSocket = socket(AF_INET, SOCK_STREAM, 0);
>    if (destSocket == INVALID_SOCKET) {
>        printf("socket unsuccessful\n");
>        status = WSACleanup();
>        if (status == SOCKET_ERROR) printf("WSACleanup unsuccessful\n");
>    }
>
>    status = connect (destSocket, (LPSOCKADDR) &destSockAddr, 
> sizeof(destSockAddr));
>
>    if (status == SOCKET_ERROR) {
>        printf ("connect failed\n");
>
>        status = closesocket(destSocket);
>        if (status == SOCKET_ERROR) printf("closesocket failed\n");
>
>        status = WSACleanup();
>        if (status == SOCKET_ERROR) printf("WSACleanup failed\n");
>
>    }
>
>    Sleep(1000);
>
>    ioctlsocket (destSocket, FIONREAD, &qtr);
>
>    if (qtr > 0) {
>        lenrcv = recv (destSocket, tbuffer, MAXBUFLEN, 0);
>    }
>
>
>        // normally all the messages would go here, but not needed for this 
> demo
>    Sleep(5000);
>
>
>    status = closesocket(destSocket);
>    if (status == SOCKET_ERROR) printf("closesocket failed\n");
>
>    status = WSACleanup();
>    if (status == SOCKET_ERROR) printf("WSACleanup failed\n");
>       }
>
> _______________________________________________
> Winpcap-users mailing list
> Winpcap-users at winpcap.org
> https://www.winpcap.org/mailman/listinfo/winpcap-users 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: iflist.zip
Type: application/octet-stream
Size: 5630 bytes
Desc: not available
Url : http://www.winpcap.org/pipermail/winpcap-users/attachments/20070328/6321a5f4/iflist.obj


More information about the Winpcap-users mailing list