Winsock 2 WSAPROTOCOL_INFO struct

#c #sockets #winapi #winsock2

#c #сокеты #winapi #winsock2

Вопрос:

Я написал небольшую программу, чтобы получить поддерживаемые типы сокетов Windows. Я пытался вывести элемент szProtocol, но всегда получаю пустую строку или «r». Кто-нибудь знает, если что-то не так? Я скомпилировал его с помощью mingw: gcc socket.c -o socket.exe -lws2_32

Мой код:

 #include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <ws2tcpip.h>
#include <objbase.h>
#include <tchar.h>
#include <wchar.h>
#ifndef UNICODE
#define UNICODE 1
#endif
#ifndef _UNICODE
#define _UNICODE
#endif
int main(int argc, char *argv[]) {
WSADATA data;
//WCHAR Guid[40] = {0};
    if(WSAStartup(MAKEWORD(1,1), amp;data) != 0) {
        fprintf(stderr, "WSAStartup failed!rn");
        exit(1);
    }
    LPWSAPROTOCOL_INFO buffer = malloc(16384);
    DWORD lngt =0;
    lngt = 32000;
    int ret = 0;
    int retI = 0;
    ret = WSAEnumProtocols(NULL,buffer,amp;lngt);
    if(ret != SOCKET_ERROR) {
        wprintf(L"Enum suceeded with %d protocols!rn",ret);
        int i;
        for(i=0; i<ret;i  ) {
            wprintf(L"Provider Entry number %dn",i);
            wprintf(L"---------------------------n");
            wprintf(L"Entry type:ttt");
            if(buffer[i].ProtocolChain.ChainLen==1) {
                wprintf(L"Base Service Providern");
            } else {
                wprintf(L"Layered Chain Entryn");
            }
            if(buffer[i].szProtocol != 0) {
            wprintf(L"Protocol (maybe API bug):tt");
            //wprintf(L"%ls: %dn",L"Unkown",buffer[i].szProtocol);
                wprintf(L"%wsn",buffer[i].szProtocol);
            } else { wprintf(L"Protocol: NONEn"); }

            // Address Family
            wprintf(L"Address Family:ttt");
            switch(buffer[i].iAddressFamily) {
            case AF_INET:
            wprintf(L"IPv4n");
            break;
            case AF_IPX:
            wprintf(L"IPXn");
            break;
            case AF_APPLETALK:
            wprintf(L"AppleTalkn");
            break;
            case AF_NETBIOS:
            wprintf(L"Netbiosn");
            case AF_INET6:
            wprintf(L"IPv6n");
            break;
            case AF_IRDA:
            wprintf(L"Infrared Data Associationn");
            break;
            case 32:
            wprintf(L"Bluetoothn");
            break;
            }

            // Socket Type
            switch(buffer[i].iSocketType) {
                case SOCK_STREAM:
                case SOCK_DGRAM:
                case SOCK_RAW:
                case SOCK_RDM:
                case SOCK_SEQPACKET:
                break;
            }
            printf("nn");
        }
        WSACleanup();
        free(buffer);
        exit(0);
    } else {
    WSACleanup();
    free(buffer);
    exit(1);
    }
}
  

Вывод:

 C:UsersxxxDesktop>socket
Enum suceeded with 9 protocols!r
Provider Entry number 0
---------------------------
Entry type:                     Base Service Provider
Protocol (maybe API bug):
Address Family:                 IPv4


Provider Entry number 1
---------------------------
Entry type:                     Base Service Provider
Protocol (maybe API bug):
Address Family:                 IPv4


Provider Entry number 2
---------------------------
Entry type:                     Base Service Provider
Protocol (maybe API bug):
Address Family:                 IPv6


Provider Entry number 3
---------------------------
Entry type:                     Base Service Provider
Protocol (maybe API bug):
Address Family:                 IPv6


Provider Entry number 4
---------------------------
Entry type:                     Base Service Provider
Protocol (maybe API bug):               r
Address Family:                 IPv6


Provider Entry number 5
---------------------------
Entry type:                     Base Service Provider
Protocol (maybe API bug):               r
Address Family:                 IPv4


Provider Entry number 6
---------------------------
Entry type:                     Base Service Provider
Protocol (maybe API bug):               r
Address Family:                 IPv6


Provider Entry number 7
---------------------------
Entry type:                     Base Service Provider
Protocol (maybe API bug):               r
Address Family:                 IPv4


Provider Entry number 8
---------------------------
Entry type:                     Base Service Provider
Protocol (maybe API bug):
Address Family:                 Bluetooth
  

Комментарии:

1.Переместить #define UNICODE 1 перед #includes .

2. Но почему для включения требуется определение UNICODE ? Типы данных всегда являются WCHAR* . Я думал, что wchar — это символ ЮНИКОДА.

3. Он вызывает WSAEnumProtocolsA(), версию ANSI, из-за неуместного #define .

4. О, WSAEnumProtocols — это всего лишь макрос, я думал, что это функция.

5. WSAEnumProtocolsA() и WSAEnumProtocolsW() являются функциями. WSAEnumProtocols() это макрос, который вызывает один или другой в зависимости от того UNICODE , определен ли он.