C++ Winsock Resources
Results 1 to 6 of 6

Thread: C++ Winsock Resources

  1. #1
    () \/V |\| 3 |) |3\/ |\|3G47|\/3
    Join Date
    Sep 2002
    Posts
    744

    C++ Winsock Resources

    I found another good resource for sockets programming! I don't usually find many with good documentation / comments but this one is really good.

    Included in Johnnie's Winsock Tutorial is the following:

    *Creating a Listening Socket
    *Sending and Receiving
    *Non-Blocking and Asynchronous Sockets
    *Winsock Programmer's FAQ <----You must check this out!!

    tangent's site contains a huge archive of frequently asked questions as well as specialized explanations ranging from the proper way to close a TCP socket to the "64 sockets" limitation. Visit for a discussion of many Winsock topics that may be relevant to your current project or to simply pick up some tips and increase your 'sock savvy.
    *Example Source Code

    .....includes a healthy sampling of examples. View source for a client utilizing the asynchronous socket model, retrieving a file from a web server, implementing the MFC CSocket class, and even a multi-threaded HTTP server application making use of blocking sockets and overlapped I/O to handle multiple connections simultaneously.

    Go Finland!
    Deviant Gallery

  2. #2
    () \/V |\| 3 |) |3\/ |\|3G47|\/3
    Join Date
    Sep 2002
    Posts
    744

    C++ Winsock Resources

    I found another good resource for sockets programming! I don't usually find many with good documentation / comments but this one is really good.

    Included in Johnnie's Winsock Tutorial is the following:

    *Creating a Listening Socket
    *Sending and Receiving
    *Non-Blocking and Asynchronous Sockets
    *Winsock Programmer's FAQ <----You must check this out!!

    tangent's site contains a huge archive of frequently asked questions as well as specialized explanations ranging from the proper way to close a TCP socket to the "64 sockets" limitation. Visit for a discussion of many Winsock topics that may be relevant to your current project or to simply pick up some tips and increase your 'sock savvy.
    *Example Source Code

    .....includes a healthy sampling of examples. View source for a client utilizing the asynchronous socket model, retrieving a file from a web server, implementing the MFC CSocket class, and even a multi-threaded HTTP server application making use of blocking sockets and overlapped I/O to handle multiple connections simultaneously.

    Go Finland!
    Deviant Gallery

  3. #3
    Senior Member
    Join Date
    Feb 2003
    Posts
    211
    hhmm .. winsock C++.
    http://tangentsoft.net/wskfaq/examples/src/snmpmac.cpp


    #include <snmp.h>
    #include <conio.h>
    #include <stdio.h>

    typedef BOOL(WINAPI * pSnmpExtensionInit) (
    IN DWORD dwTimeZeroReference,
    OUT HANDLE * hPollForTrapEvent,
    OUT AsnObjectIdentifier * supportedView);

    typedef BOOL(WINAPI * pSnmpExtensionTrap) (
    OUT AsnObjectIdentifier * enterprise,
    OUT AsnInteger * genericTrap,
    OUT AsnInteger * specificTrap,
    OUT AsnTimeticks * timeStamp,
    OUT RFC1157VarBindList * variableBindings);

    typedef BOOL(WINAPI * pSnmpExtensionQuery) (
    IN BYTE requestType,
    IN OUT RFC1157VarBindList * variableBindings,
    OUT AsnInteger * errorStatus,
    OUT AsnInteger * errorIndex);

    typedef BOOL(WINAPI * pSnmpExtensionInitEx) (
    OUT AsnObjectIdentifier * supportedView);

    void main()
    {
    WSADATA WinsockData;
    if (WSAStartup(MAKEWORD(2, 0), &WinsockData) != 0) {
    fprintf(stderr, "This program requires Winsock 2.x!\n");
    return;
    }

    HINSTANCE m_hInst;
    pSnmpExtensionInit m_Init;
    pSnmpExtensionInitEx m_InitEx;
    pSnmpExtensionQuery m_Query;
    pSnmpExtensionTrap m_Trap;
    HANDLE PollForTrapEvent;
    AsnObjectIdentifier SupportedView;
    UINT OID_ifEntryType[] = {
    1, 3, 6, 1, 2, 1, 2, 2, 1, 3
    };
    UINT OID_ifEntryNum[] = {
    1, 3, 6, 1, 2, 1, 2, 1
    };
    UINT OID_ipMACEntAddr[] = {
    1, 3, 6, 1, 2, 1, 2, 2, 1, 6
    }; //, 1 ,6 };
    AsnObjectIdentifier MIB_ifMACEntAddr =
    { sizeof(OID_ipMACEntAddr) / sizeof(UINT), OID_ipMACEntAddr };
    AsnObjectIdentifier MIB_ifEntryType = {
    sizeof(OID_ifEntryType) / sizeof(UINT), OID_ifEntryType
    };
    AsnObjectIdentifier MIB_ifEntryNum = {
    sizeof(OID_ifEntryNum) / sizeof(UINT), OID_ifEntryNum
    };
    RFC1157VarBindList varBindList;
    RFC1157VarBind varBind[2];
    AsnInteger errorStatus;
    AsnInteger errorIndex;
    AsnObjectIdentifier MIB_NULL = {
    0, 0
    };
    int ret;
    int dtmp;
    int i = 0, j = 0;
    BOOL found = FALSE;
    char TempEthernet[13];
    m_Init = NULL;
    m_InitEx = NULL;
    m_Query = NULL;
    m_Trap = NULL;

    /* Load the SNMP dll and get the addresses of the functions
    necessary */
    m_hInst = LoadLibrary("inetmib1.dll");
    if (m_hInst < (HINSTANCE) HINSTANCE_ERROR) {
    m_hInst = NULL;
    return;
    }
    m_Init =
    (pSnmpExtensionInit) GetProcAddress(m_hInst, "SnmpExtensionInit");
    m_InitEx =
    (pSnmpExtensionInitEx) GetProcAddress(m_hInst,
    "SnmpExtensionInitEx");
    m_Query =
    (pSnmpExtensionQuery) GetProcAddress(m_hInst,
    "SnmpExtensionQuery");
    m_Trap =
    (pSnmpExtensionTrap) GetProcAddress(m_hInst, "SnmpExtensionTrap");
    m_Init(GetTickCount(), &PollForTrapEvent, &SupportedView);

    /* Initialize the variable list to be retrieved by m_Query */
    varBindList.list = varBind;
    varBind[0].name = MIB_NULL;
    varBind[1].name = MIB_NULL;

    /* Copy in the OID to find the number of entries in the
    Inteface table */
    varBindList.len = 1; /* Only retrieving one item */
    SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryNum);
    ret =
    m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus,
    &errorIndex);
    printf("# of adapters in this system : %i\n",
    varBind[0].value.asnValue.number); varBindList.len = 2;

    /* Copy in the OID of ifType, the type of interface */
    SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryType);

    /* Copy in the OID of ifPhysAddress, the address */
    SNMP_oidcpy(&varBind[1].name, &MIB_ifMACEntAddr);

    do {

    /* Submit the query. Responses will be loaded into varBindList.
    We can expect this call to succeed a # of times corresponding
    to the # of adapters reported to be in the system */
    ret =
    m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus,
    &errorIndex); if (!ret) ret = 1;

    else
    /* Confirm that the proper type has been returned */
    ret =
    SNMP_oidncmp(&varBind[0].name, &MIB_ifEntryType,
    MIB_ifEntryType.idLength); if (!ret) {
    j++;
    dtmp = varBind[0].value.asnValue.number;
    printf("Interface #%i type : %i\n", j, dtmp);

    /* Type 6 describes ethernet interfaces */
    if (dtmp == 6) {

    /* Confirm that we have an address here */
    ret =
    SNMP_oidncmp(&varBind[1].name, &MIB_ifMACEntAddr,
    MIB_ifMACEntAddr.idLength);
    if ((!ret)
    && (varBind[1].value.asnValue.address.stream != NULL)) {
    if (
    (varBind[1].value.asnValue.address.stream[0] ==
    0x44)
    && (varBind[1].value.asnValue.address.stream[1] ==
    0x45)
    && (varBind[1].value.asnValue.address.stream[2] ==
    0x53)
    && (varBind[1].value.asnValue.address.stream[3] ==
    0x54)
    && (varBind[1].value.asnValue.address.stream[4] ==
    0x00)) {

    /* Ignore all dial-up networking adapters */
    printf("Interface #%i is a DUN adapter\n", j);
    continue;
    }
    if (
    (varBind[1].value.asnValue.address.stream[0] ==
    0x00)
    && (varBind[1].value.asnValue.address.stream[1] ==
    0x00)
    && (varBind[1].value.asnValue.address.stream[2] ==
    0x00)
    && (varBind[1].value.asnValue.address.stream[3] ==
    0x00)
    && (varBind[1].value.asnValue.address.stream[4] ==
    0x00)
    && (varBind[1].value.asnValue.address.stream[5] ==
    0x00)) {

    /* Ignore NULL addresses returned by other network
    interfaces */
    printf("Interface #%i is a NULL address\n", j);
    continue;
    }
    sprintf(TempEthernet, "%02x%02x%02x%02x%02x%02x",
    varBind[1].value.asnValue.address.stream[0],
    varBind[1].value.asnValue.address.stream[1],
    varBind[1].value.asnValue.address.stream[2],
    varBind[1].value.asnValue.address.stream[3],
    varBind[1].value.asnValue.address.stream[4],
    varBind[1].value.asnValue.address.stream[5]);
    printf("MAC Address of interface #%i: %s\n", j,
    TempEthernet);}
    }
    }
    } while (!ret); /* Stop only on an error. An error will occur
    when we go exhaust the list of interfaces to
    be examined */
    getch();

    /* Free the bindings */
    SNMP_FreeVarBind(&varBind[0]);
    SNMP_FreeVarBind(&varBind[1]);
    }


    thanks math girl, finally i can find a site which contained with Winsock C++. Thanks mate.

    When I lay me down to sleep, Pray the LORD my soul to keep.
    If I die before i wake, Pray the LORD my soul to take.

    http://www.AntiOnline.com/sig.php?imageid=389

  4. #4
    Senior Member
    Join Date
    Feb 2003
    Posts
    211
    hhmm .. winsock C++.
    http://tangentsoft.net/wskfaq/examples/src/snmpmac.cpp


    #include <snmp.h>
    #include <conio.h>
    #include <stdio.h>

    typedef BOOL(WINAPI * pSnmpExtensionInit) (
    IN DWORD dwTimeZeroReference,
    OUT HANDLE * hPollForTrapEvent,
    OUT AsnObjectIdentifier * supportedView);

    typedef BOOL(WINAPI * pSnmpExtensionTrap) (
    OUT AsnObjectIdentifier * enterprise,
    OUT AsnInteger * genericTrap,
    OUT AsnInteger * specificTrap,
    OUT AsnTimeticks * timeStamp,
    OUT RFC1157VarBindList * variableBindings);

    typedef BOOL(WINAPI * pSnmpExtensionQuery) (
    IN BYTE requestType,
    IN OUT RFC1157VarBindList * variableBindings,
    OUT AsnInteger * errorStatus,
    OUT AsnInteger * errorIndex);

    typedef BOOL(WINAPI * pSnmpExtensionInitEx) (
    OUT AsnObjectIdentifier * supportedView);

    void main()
    {
    WSADATA WinsockData;
    if (WSAStartup(MAKEWORD(2, 0), &WinsockData) != 0) {
    fprintf(stderr, "This program requires Winsock 2.x!\n");
    return;
    }

    HINSTANCE m_hInst;
    pSnmpExtensionInit m_Init;
    pSnmpExtensionInitEx m_InitEx;
    pSnmpExtensionQuery m_Query;
    pSnmpExtensionTrap m_Trap;
    HANDLE PollForTrapEvent;
    AsnObjectIdentifier SupportedView;
    UINT OID_ifEntryType[] = {
    1, 3, 6, 1, 2, 1, 2, 2, 1, 3
    };
    UINT OID_ifEntryNum[] = {
    1, 3, 6, 1, 2, 1, 2, 1
    };
    UINT OID_ipMACEntAddr[] = {
    1, 3, 6, 1, 2, 1, 2, 2, 1, 6
    }; //, 1 ,6 };
    AsnObjectIdentifier MIB_ifMACEntAddr =
    { sizeof(OID_ipMACEntAddr) / sizeof(UINT), OID_ipMACEntAddr };
    AsnObjectIdentifier MIB_ifEntryType = {
    sizeof(OID_ifEntryType) / sizeof(UINT), OID_ifEntryType
    };
    AsnObjectIdentifier MIB_ifEntryNum = {
    sizeof(OID_ifEntryNum) / sizeof(UINT), OID_ifEntryNum
    };
    RFC1157VarBindList varBindList;
    RFC1157VarBind varBind[2];
    AsnInteger errorStatus;
    AsnInteger errorIndex;
    AsnObjectIdentifier MIB_NULL = {
    0, 0
    };
    int ret;
    int dtmp;
    int i = 0, j = 0;
    BOOL found = FALSE;
    char TempEthernet[13];
    m_Init = NULL;
    m_InitEx = NULL;
    m_Query = NULL;
    m_Trap = NULL;

    /* Load the SNMP dll and get the addresses of the functions
    necessary */
    m_hInst = LoadLibrary("inetmib1.dll");
    if (m_hInst < (HINSTANCE) HINSTANCE_ERROR) {
    m_hInst = NULL;
    return;
    }
    m_Init =
    (pSnmpExtensionInit) GetProcAddress(m_hInst, "SnmpExtensionInit");
    m_InitEx =
    (pSnmpExtensionInitEx) GetProcAddress(m_hInst,
    "SnmpExtensionInitEx");
    m_Query =
    (pSnmpExtensionQuery) GetProcAddress(m_hInst,
    "SnmpExtensionQuery");
    m_Trap =
    (pSnmpExtensionTrap) GetProcAddress(m_hInst, "SnmpExtensionTrap");
    m_Init(GetTickCount(), &PollForTrapEvent, &SupportedView);

    /* Initialize the variable list to be retrieved by m_Query */
    varBindList.list = varBind;
    varBind[0].name = MIB_NULL;
    varBind[1].name = MIB_NULL;

    /* Copy in the OID to find the number of entries in the
    Inteface table */
    varBindList.len = 1; /* Only retrieving one item */
    SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryNum);
    ret =
    m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus,
    &errorIndex);
    printf("# of adapters in this system : %i\n",
    varBind[0].value.asnValue.number); varBindList.len = 2;

    /* Copy in the OID of ifType, the type of interface */
    SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryType);

    /* Copy in the OID of ifPhysAddress, the address */
    SNMP_oidcpy(&varBind[1].name, &MIB_ifMACEntAddr);

    do {

    /* Submit the query. Responses will be loaded into varBindList.
    We can expect this call to succeed a # of times corresponding
    to the # of adapters reported to be in the system */
    ret =
    m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus,
    &errorIndex); if (!ret) ret = 1;

    else
    /* Confirm that the proper type has been returned */
    ret =
    SNMP_oidncmp(&varBind[0].name, &MIB_ifEntryType,
    MIB_ifEntryType.idLength); if (!ret) {
    j++;
    dtmp = varBind[0].value.asnValue.number;
    printf("Interface #%i type : %i\n", j, dtmp);

    /* Type 6 describes ethernet interfaces */
    if (dtmp == 6) {

    /* Confirm that we have an address here */
    ret =
    SNMP_oidncmp(&varBind[1].name, &MIB_ifMACEntAddr,
    MIB_ifMACEntAddr.idLength);
    if ((!ret)
    && (varBind[1].value.asnValue.address.stream != NULL)) {
    if (
    (varBind[1].value.asnValue.address.stream[0] ==
    0x44)
    && (varBind[1].value.asnValue.address.stream[1] ==
    0x45)
    && (varBind[1].value.asnValue.address.stream[2] ==
    0x53)
    && (varBind[1].value.asnValue.address.stream[3] ==
    0x54)
    && (varBind[1].value.asnValue.address.stream[4] ==
    0x00)) {

    /* Ignore all dial-up networking adapters */
    printf("Interface #%i is a DUN adapter\n", j);
    continue;
    }
    if (
    (varBind[1].value.asnValue.address.stream[0] ==
    0x00)
    && (varBind[1].value.asnValue.address.stream[1] ==
    0x00)
    && (varBind[1].value.asnValue.address.stream[2] ==
    0x00)
    && (varBind[1].value.asnValue.address.stream[3] ==
    0x00)
    && (varBind[1].value.asnValue.address.stream[4] ==
    0x00)
    && (varBind[1].value.asnValue.address.stream[5] ==
    0x00)) {

    /* Ignore NULL addresses returned by other network
    interfaces */
    printf("Interface #%i is a NULL address\n", j);
    continue;
    }
    sprintf(TempEthernet, "%02x%02x%02x%02x%02x%02x",
    varBind[1].value.asnValue.address.stream[0],
    varBind[1].value.asnValue.address.stream[1],
    varBind[1].value.asnValue.address.stream[2],
    varBind[1].value.asnValue.address.stream[3],
    varBind[1].value.asnValue.address.stream[4],
    varBind[1].value.asnValue.address.stream[5]);
    printf("MAC Address of interface #%i: %s\n", j,
    TempEthernet);}
    }
    }
    } while (!ret); /* Stop only on an error. An error will occur
    when we go exhaust the list of interfaces to
    be examined */
    getch();

    /* Free the bindings */
    SNMP_FreeVarBind(&varBind[0]);
    SNMP_FreeVarBind(&varBind[1]);
    }


    thanks math girl, finally i can find a site which contained with Winsock C++. Thanks mate.

    When I lay me down to sleep, Pray the LORD my soul to keep.
    If I die before i wake, Pray the LORD my soul to take.

    http://www.AntiOnline.com/sig.php?imageid=389

  5. #5
    Senior Member
    Join Date
    Feb 2003
    Posts
    282
    I found the above code published by Borland, did you realy write that code?

    http://bdn.borland.com/article/0,141...0.html#method3

    [Edit]The true author needs to get their credit, I wounder who wrote it[/Edit]

  6. #6
    () \/V |\| 3 |) |3\/ |\|3G47|\/3
    Join Date
    Sep 2002
    Posts
    744


    EDIT: Shadow removed the "offending" line. I think what he meant just got lost in the translation.....???

    Go Finland!
    Deviant Gallery

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •