#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
, определен ли он.