Форум: "Сети";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
ВнизНе могу разобраться с параметрами WSAEnumProtocols Найти похожие ветки
← →
Григорьев Антон © (2004-09-16 10:39) [0]Согласно MSDN"у, первый параметр этой функции содержит указатель на массив идентификторов протоколов, о которых нужно получить информацию (или NULL, если нужно получить информацию по всем протоколам). При этом нигде не написано, какие значения должны принимать элементы этого массива. Например, что я должен в него записать, если хочу получить информацию о протоколах TCP и UDP?
← →
Verg © (2004-09-16 12:14) [1](IPPROTO_TCP, IPPROTO_TCP, 0)
← →
Verg © (2004-09-16 12:14) [2](IPPROTO_TCP, IPPROTO_UDP, 0)
← →
Rouse_ © (2004-09-16 12:31) [3]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, WinSock;
const
MAX_PROTOCOL_CHAIN = 7;
WSAPROTOCOL_LEN = 255;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
end;
_WSAPROTOCOLCHAIN = record
ChainLen: Integer; // the length of the chain,
// length = 0 means layered protocol,
// length = 1 means base protocol,
// length > 1 means protocol chain
ChainEntries: array [0..MAX_PROTOCOL_CHAIN - 1] of DWORD; // a list of dwCatalogEntryIds
end;
{$EXTERNALSYM _WSAPROTOCOLCHAIN}
WSAPROTOCOLCHAIN = _WSAPROTOCOLCHAIN;
{$EXTERNALSYM WSAPROTOCOLCHAIN}
LPWSAPROTOCOLCHAIN = ^WSAPROTOCOLCHAIN;
{$EXTERNALSYM LPWSAPROTOCOLCHAIN}
TWsaProtocolChain = WSAPROTOCOLCHAIN;
PWsaProtocolChain = LPWSAPROTOCOLCHAIN;
_WSAPROTOCOL_INFOW = record
dwServiceFlags1: DWORD;
dwServiceFlags2: DWORD;
dwServiceFlags3: DWORD;
dwServiceFlags4: DWORD;
dwProviderFlags: DWORD;
ProviderId: TGUID;
dwCatalogEntryId: DWORD;
ProtocolChain: WSAPROTOCOLCHAIN;
iVersion: Integer;
iAddressFamily: Integer;
iMaxSockAddr: Integer;
iMinSockAddr: Integer;
iSocketType: Integer;
iProtocol: Integer;
iProtocolMaxOffset: Integer;
iNetworkByteOrder: Integer;
iSecurityScheme: Integer;
dwMessageSize: DWORD;
dwProviderReserved: DWORD;
szProtocol: array [0..WSAPROTOCOL_LEN] of WideChar;
end;
{$EXTERNALSYM _WSAPROTOCOL_INFOW}
WSAPROTOCOL_INFOW = _WSAPROTOCOL_INFOW;
{$EXTERNALSYM WSAPROTOCOL_INFOW}
LPWSAPROTOCOL_INFOW = ^WSAPROTOCOL_INFOW;
{$EXTERNALSYM LPWSAPROTOCOL_INFOW}
TWsaProtocolInfoW = WSAPROTOCOL_INFOW;
PWsaProtocolInfoW = LPWSAPROTOCOL_INFOW;
function WSAEnumProtocols(lpiProtocols: PINT; lpProtocolBuffer: LPWSAPROTOCOL_INFOW;
var lpdwBufferLength: DWORD): Integer; stdcall; external "Ws2_32.dll" name "WSAEnumProtocolsW";
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
Info: array [0..1023] of TWsaProtocolInfoW;
Len: DWORD;
Err, I, Family: Integer;
WSA: TWSAData;
begin
Len := SizeOf(TWsaProtocolInfoW) * 1024;
WSAStartup($202, WSA);
try
FillChar(Info, Len, #0);
Family := AF_NETBIOS; // Вот то что тебе нужно...
Err := WSAEnumProtocols(@Family, @Info, Len);
if Err = SOCKET_ERROR then
begin
ShowMessage(SysErrorMessage(WSAGetLastError));
Exit;
end;
for I := 0 to Err - 1 do
begin
Memo1.Lines.Add(info[I].szProtocol);
end;
finally
WSACleanup;
end;
end;
end.
← →
Digitman © (2004-09-16 13:48) [4]
> Григорьев Антон
в Кладовке лежит архив с утилиткой и ее исходниками ... полюбопытствуй
← →
Rouse_ © (2004-09-16 13:58) [5]> [4] Digitman © (16.09.04 13:48)
Кладовка уже незнамо сколько не работает... :)
← →
Григорьев Антон © (2004-09-16 15:24) [6]
> Digitman © (16.09.04 13:48) [4]
А где-нибудь в другом месте этот пример посмотреть нельзя, раз кладовка закрыта?
Вообще, с TCP и UDP всё более-менее понятно. Но непонятен общий принцип. Есть ведь ещё и другие протоколы. И у некоторых константы совпадают (например, DNPROTO_NSP и ATMPROTO_ALL1 обе равны единице). Ну и как их различать?
Наткнулся тут на функцию getprotobyname, вроде, через неё можно получить какой-то номер протокола, но не могу понять, это тот номер или какой-то другой.
← →
Digitman © (2004-09-16 15:44) [7]program NetProtoViewer;
{$APPTYPE CONSOLE}
uses
Windows,
Messages,
ComObj,
SysUtils,
Winsock2;
const
ole32_DLL = "ole32.dll";
FmtOffs = #10#13" ";
var
hWinSock2: THandle;
WSAData: TWSAData;
i,j: Integer;
ProtocolCount: Integer;
BufSize, FlagMask: DWord;
InstProtocols, Protocol: LPWSAProtocol_Info;
tmpstr: string;
tmpwstr: PWideChar;
function StringFromCLSID(const clsid: TGUID; out psz: PWideChar): HResult; stdcall; external ole32_DLL name "StringFromCLSID";
procedure CoTaskMemFree(pv: Pointer); stdcall; external ole32_DLL name "CoTaskMemFree";
begin
hWinSock2:= LoadLibrary(WINSOCK2_DLL);
if hWinSock2 > HINSTANCE_ERROR then begin
WSAStartup($0202, WSAData);
WriteLn("*****************************************************");
WriteLn("************* Network protocols info ****************");
WriteLn("*****************************************************");
WriteLn;
try
BufSize:= 0;
ProtocolCount:= WSAEnumProtocols(nil, nil, BufSize);
if (ProtocolCount <> SOCKET_ERROR) and (WSAGetLastError <> WSAENOBUFS) then
Exit
else begin
InstProtocols:= AllocMem(BufSize);
try
ProtocolCount:= WSAEnumProtocols(nil, InstProtocols, BufSize);
if ProtocolCount <> SOCKET_ERROR then begin
WriteLn("Total network protocols installed : " + IntToStr(ProtocolCount) + #10#13);
WriteLn("**************************************************");
Protocol:= InstProtocols;
for i:= 0 to ProtocolCount - 1 do begin
WriteLn("Protocol name : " + Protocol.szProtocol);
case Protocol.iAddressFamily of
AF_UNSPEC : tmpstr:= "unspecified";
AF_UNIX : tmpstr:= "Local host (pipes or portals)";
AF_INET : tmpstr:= "Internetwork: UDP, TCP, etc.";
AF_IMPLINK : tmpstr:= "ArpaNet imp addresses";
AF_PUP : tmpstr:= "PUP";
AF_CHAOS : tmpstr:= "mit CHAOS";
AF_IPX : tmpstr:= "IPX/SPX or XEROX NS";
AF_OSI : tmpstr:= "OSI";
AF_ECMA : tmpstr:= "European computer manufacturers (ECMA)";
AF_DATAKIT : tmpstr:= "Datakit protocols";
AF_CCITT : tmpstr:= "CCITT protocols, X.25 etc";
AF_SNA : tmpstr:= "IBM SNA";
AF_DECnet : tmpstr:= "DECnet";
AF_DLI : tmpstr:= "Direct data link interface";
AF_LAT : tmpstr:= "LAT";
AF_HYLINK : tmpstr:= "NSC Hyperchannel";
AF_APPLETALK: tmpstr:= "AppleTalk";
AF_NETBIOS : tmpstr:= "NetBios";
AF_VOICEVIEW: tmpstr:= "VoiceView";
AF_FIREFOX : tmpstr:= "FireFox";
AF_BAN : tmpstr:= "Banyan";
AF_ATM : tmpstr:= "Native ATM Services";
AF_INET6 : tmpstr:= "Internetwork Version 6";
AF_CLUSTER : tmpstr:= "Microsoft Wolfpack";
AF_12844 : tmpstr:= "IEEE 1284.4 WG AF";
AF_IRDA : tmpstr:= "IrDA";
AF_NETDES : tmpstr:= "Network Designers OSI & Gateway enabled";
else
tmpstr:= "unknown";
end;
WriteLn("Address family : " + tmpstr);
WriteLn("Protocol version : " + IntToStr(Protocol.iVersion));
case Protocol.iSocketType of
SOCK_STREAM : tmpstr:= "stream socket";
SOCK_DGRAM : tmpstr:= "datagram socket";
SOCK_RAW : tmpstr:= "raw-protocol interface";
SOCK_RDM : tmpstr:= "reliably-delivered message";
SOCK_SEQPACKET : tmpstr:= "sequenced packet stream";
else
tmpstr:= "unknown";
end;
WriteLn("Socket type : " + tmpstr);
WriteLn("MaxSockAddr : " + IntToStr(Protocol.iMaxSockAddr));
WriteLn("MinSockAddr : " + IntToStr(Protocol.iMinSockAddr));
if StringFromCLSID(Protocol.ProviderId, tmpwstr) = S_OK then begin
tmpstr:= tmpwstr;
CoTaskMemFree(tmpwstr);
end else
tmpstr:= "unknown";
WriteLn("Provider GUID : " + tmpstr);
// if ((Protocol.dwServiceFlags1 and XP1_QOS_SUPPORTED) = XP1_QOS_SUPPORTED)
// and (Protocol.iSocketType = SocketType)
// and (Protocol.iAddressFamily = AF_INET ) then
tmpstr:= "";
for j:= 0 to 31 do begin
FlagMask:= 1 shl j;
if (Protocol.dwServiceFlags1 and FlagMask) = FlagMask then
case FlagMask of
XP1_CONNECTIONLESS :begin if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs; tmpstr:= tmpstr + "CONNECTIONLESS"; end;
← →
Digitman © (2004-09-16 15:45) [8]XP1_GUARANTEED_DELIVERY :begin if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs; tmpstr:= tmpstr + "GUARANTEED_DELIVERY"; end;
XP1_GUARANTEED_ORDER :begin if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs; tmpstr:= tmpstr + "GUARANTEED_ORDER"; end;
XP1_MESSAGE_ORIENTED :begin if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs; tmpstr:= tmpstr + "MESSAGE_ORIENTED"; end;
XP1_PSEUDO_STREAM :begin if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs; tmpstr:= tmpstr + "PSEUDO_STREAM"; end;
XP1_GRACEFUL_CLOSE :begin if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs; tmpstr:= tmpstr + "GRACEFUL_CLOSE"; end;
XP1_EXPEDITED_DATA :begin if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs; tmpstr:= tmpstr + "EXPEDITED_DATA"; end;
XP1_CONNECT_DATA :begin if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs; tmpstr:= tmpstr + "CONNECT_DATA"; end;
XP1_DISCONNECT_DATA :begin if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs; tmpstr:= tmpstr + "DISCONNECT_DATA"; end;
XP1_SUPPORT_BROADCAST :begin if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs; tmpstr:= tmpstr + "SUPPORT_BROADCAST"; end;
XP1_SUPPORT_MULTIPOINT :begin if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs; tmpstr:= tmpstr + "SUPPORT_MULTIPOINT"; end;
XP1_MULTIPOINT_CONTROL_PLANE :begin if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs; tmpstr:= tmpstr + "MULTIPOINT_CONTROL_PLANE"; end;
XP1_MULTIPOINT_DATA_PLANE :begin if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs; tmpstr:= tmpstr + "MULTIPOINT_DATA_PLANE"; end;
XP1_QOS_SUPPORTED :begin if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs; tmpstr:= tmpstr + "QOS_SUPPORTED"; end;
XP1_INTERRUPT :begin if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs; tmpstr:= tmpstr + "INTERRUPT"; end;
XP1_UNI_SEND :begin if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs; tmpstr:= tmpstr + "UNI_SEND"; end;
XP1_UNI_RECV :begin if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs; tmpstr:= tmpstr + "UNI_RECV"; end;
XP1_IFS_HANDLES :begin if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs; tmpstr:= tmpstr + "IFS_HANDLES"; end;
XP1_PARTIAL_MESSAGE :begin if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs; tmpstr:= tmpstr + "PARTIAL_MESSAGE"; end;
else
if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs;
tmpstr:= tmpstr + "Unknown($" + IntToHex(FlagMask, 8) + ")";
end;
end;
Write("Service flags 1 : ");
if tmpstr <> "" then
WriteLn(tmpstr)
else
WriteLn("Not specified");
tmpstr:= "";
for j:= 0 to 31 do begin
FlagMask:= 1 shl j;
if (Protocol.dwProviderFlags and FlagMask) = FlagMask then
case FlagMask of
PFL_MULTIPLE_PROTO_ENTRIES :begin if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs; tmpstr:= tmpstr + "MULTIPLE_PROTO_ENTRIES"; end;
PFL_RECOMMENDED_PROTO_ENTRY :begin if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs; tmpstr:= tmpstr + "RECOMMENDED_PROTO_ENTRY"; end;
PFL_HIDDEN :begin if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs; tmpstr:= tmpstr + "HIDDEN"; end;
PFL_MATCHES_PROTOCOL_ZERO :begin if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs; tmpstr:= tmpstr + "MATCHES_PROTOCOL_ZERO"; end;
else
if tmpstr <> "" then tmpstr:= tmpstr + FmtOffs;
tmpstr:= tmpstr + "Unknown($" + IntToHex(FlagMask, 8) + ")";
end;
end;
Write("Provider flags : ");
if tmpstr <> "" then
WriteLn(tmpstr)
else
WriteLn("Not specified");
WriteLn("--------------------------------------------------");
if Succ(i) < ProtocolCount then begin
Write("Press ENTER to continue ...");
ReadLn;
WriteLn;
Inc(Integer(Protocol), SizeOf(TWSAProtocol_Info));
end;
end;
end;
finally
FreeMem(InstProtocols);
end;
end;
finally
WSACleanup;
end;
end else begin
WriteLn("Missing library " + WINSOCK2_DLL);
end;
Write("Press ENTER to exit ...");
ReadLn;
end.
← →
Rouse_ © (2004-09-16 15:55) [9]Сергей, это понятно, непонятно другое, где взять описание констант которые нужно подставлять в качестве первого параметра для отбора протоколов соответствующих условиям...
Я вот поискал и нашел примерно следующие:
IPPROTO_IP = 0; // dummy for IP
IPPROTO_ICMP = 1; // control message protocol
IPPROTO_IGMP = 2; // internet group management protocol
IPPROTO_GGP = 3; // gateway^2 (deprecated)
IPPROTO_IPV4 = 4; // IPv4
IPPROTO_TCP = 6; // tcp
IPPROTO_PUP = 12; // pup
IPPROTO_UDP = 17; // user datagram protocol
IPPROTO_IDP = 22; // xns idp
ISOPROTO_TP4 = 29 " ISO connection-oriented transport protocol.
IPPROTO_IPV6 = 41; // IPv6
IPPROTO_ROUTING = 43; // IPv6 routing header
IPPROTO_FRAGMENT = 44; // IPv6 fragmentation header
IPPROTO_ESP = 50; // IPsec ESP header
IPPROTO_AH = 51; // IPsec AH
IPPROTO_ICMPV6 = 58; // ICMPv6
IPPROTO_NONE = 59; // IPv6 no next header
IPPROTO_DSTOPTS = 60; // IPv6 destination options
IPPROTO_ND = 77; // UNOFFICIAL net disk proto
IPPROTO_ICLFXBM = 78;
IPPROTO_RAW = 255; // raw IP packet
NSPROTO_IPX = 1000 " IPX.
NSPROTO_SPX = 1256 " SPX.
NSPROTO_SPXII = 1257 " SPX II.
Выделенные жирным не описаны в Winsock2...
Какие либо еще константы существуют?
← →
Григорьев Антон © (2004-09-16 16:07) [10]
> Выделенные жирным не описаны в Winsock2...
В SDK они описаны, просто константы для протколов не из семейства AF_Inet описаны в не в winsock2.h, а в отдельных заголовочных файлах.
Для AF_APPLETALK (ATPROTO_XXX) - в atalkwsh.h
Для AF_ATM (ATMPROTO_XXX) - в ws2atm.h
Для AF_DECnet (DNPROTO_XXX) - в ws2dnet.h
Для AF_ISO (ISOPROTO_XXX) - в wshisotp.h
Для AF_IPX (NSPROTO_XXX) - в wsipx.h
Для AF_BAN (VNSPROTO_XXX) - в wsvns.h
← →
Digitman © (2004-09-16 16:08) [11]
> Rouse_ © (16.09.04 15:55) [9]
а шут его знает, Александр ...
я не интересовался даже ..
просто продублировал тот код, который д.б. лежать в кладовке
← →
Verg © (2004-09-16 16:48) [12]
> FillChar(Info, Len, #0);
> Family := AF_NETBIOS; // Вот то что тебе нужно...
> Err := WSAEnumProtocols(@Family, @Info, Len);
И при чем тут AF_xxx канстанты? А где "ноль?lpiProtocols
[in] Null-terminated array of iProtocol values. This parameter is optional; if lpiProtocols is NULL, information on all available protocols is returned. Otherwise, information is retrieved only for those protocols listed in the array.iProtocol
Value to pass as the protocol parameter to the socket function in order to open a socket for this protocol.
← →
Rouse_ © (2004-09-16 18:03) [13]> [12] Verg © (16.09.04 16:48)
Да я на вскидку написал, небыло времени что-то там проверять по хелпу :)
← →
Григорьев Антон © (2004-09-17 12:06) [14]
> Verg © (16.09.04 16:48) [12]
А откуда взялась вот эта фраза?
iProtocol
Value to pass as the protocol parameter to the socket function in order to open a socket for this protocol.
В MSDN"е в описании WSAEnumProtocols мне её найти не удалось.
В WinSock 1 есть аналогичная функция EnumProtocols. В её описании чётко перечислены все константы, которые могут использоваться для нумерации протоколов в этой функции:
IPPROTO_TCP
IPPROTO_UDP
ISOPROTO_TP4
NSPROTO_IPX
NSPROTO_SPX
NSPROTO_SPXII
А вот для WSAEnumProtocols мне такого перечисления найти не удалось.
← →
Verg © (2004-09-17 12:11) [15]lpProtocolBuffer
[out] Buffer that is filled with WSAPROTOCOL_INFO structures.
По жирненькому тырц....
..................
int iMaxSockAddr;
int iMinSockAddr;
int iSocketType;
int iProtocol;
int iProtocolMaxOffset;
int iNetworkByteOrder;
int iSecurityScheme;
....................
По жирненькому тырц....
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.036 c