Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.034 c
6-1095658998
KIR
2004-09-20 09:43
2004.11.28
TServerSocket и TcpServer


1-1100457493
m.alex
2004-11-14 21:38
2004.11.28
Помогите сделать список обьектов некоторого класса


1-1100108593
BlackLord2003
2004-11-10 20:43
2004.11.28
Сообщение об ошибках


4-1098012867
volser
2004-10-17 15:34
2004.11.28
Генерация GUID


3-1099409227
DimonNew
2004-11-02 18:27
2004.11.28
модификация данных из двух запросов в ADO





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский