Komunikuje buď jako klient se serverem pomocí síťového protokolu
TCP/IP nebo může v rámci počítačové sítě přijímat a posílat
UDP pakety.
Vlastnosti ovladače
Komunikace s navazováním spojení — TCP/IP klient.
Obousměrný přenos dat datagramovou metodou
(UDP).
Rozhraní mezi ovladačem a aplikací řešené prostřednictvím
procedur ovladače.
Vyhodnocení a zpracování síťových událostí na základě
výjimek od ovladače.
Seznam sekcí: - Vlastnosti ovladače
- Činnost ovladače
- Procedury ovladače
- Parametry ovladače
- Kanály ovladače
- Mapovací soubor ovladače a datové typy
- Zpracování a stavy výjimek ovladače
- Chybové kódy
- Příklad použití ovladače
Činnost ovladače
Ovladač může pracovat v jednom ze dvou režimů. Prvním je
režim TCP/IP klient, kdy je třeba nejprve vytvořit spojení se
serverem a teprve pak je možno přenášet data. Ve druhém režimu
(UDP) je možno přenášet data bez předchozího navazování
spojení.
Klient TCP/IP
V tomto režimu je třeba nejprve vytvořit TCP spojení
s požadovaným serverem. Jméno nebo IP adresa a IP port
serveru se zadává procedurou SetHost. Pomocí
procedury Connect se naváže spojení se serverem.
Výsledek této operace je signalizován výjimkou od ovladače a
pomocí volání procedur ReadStatus a ReadError
je možno zjistit, jestli se spojení podařilo navázat nebo ne.
V případě úspěšného navázání spojení je možno začít
komunikovat se serverem. K tomu slouží celá skupina
procedur, které budou popsány později. Je možno posílat data
do serveru jako řetězce nebo jako binární data. Příjem dat ze
serveru vyvolá událost a pomocí procedur je možno data vyčíst
buď jako řetězec nebo jako binární data. Pomocí procedury
Receive může klient spustit synchronní čekání na
data (např. po předchozím vyslání požadavku). V tomto
čekání ovladač setrvá, dokud server data nevrátí nebo dokud
nevyprší timeout. Ukončení spojení může nastat buď voláním
procedury Disconnect nebo tím, že se odpojí
server.
Komunikace UDP
Na rozdíl od TCP komunikace se v UDP komunikaci jedná
o jednoduchý přenos datových rámců (paketů) mezi různými
zařízeními bez navazování spojení, potvrzování a dalších
kontrolních mechanizmů. K vytvoření komunikačního kanálu
je třeba pomocí procedury BindUDP zadat IP port,
přes který ovladač komunikuje (očekává data od zdroje dat,
vysílá data). Pro vyslání dat cílovému zařízení je třeba znát
jeho jméno nebo IP adresu a jeho IP port, přes který
komunikuje. K zadání těchto parametrů slouží procedura
SetHost (podobně jako u TCP komunikace).
K vlastnímu přenosu dat slouží celá řada procedur popsaná
v další části. Příjem dat vyvolá událost podobně jako je
tomu u režimu TCP klient. K uvolnění IP portu a
zrušení možnosti příjmu dat slouží procedura Disconnect.
Procedury ovladače
Veškeré řízení činnosti ovladače je realizováno prostřednictvím
volání jeho vnitřních procedur. K tomuto účelu existuje
v systému Control Web systémová
procedura:
core.DriverQueryProc( DriverName : string; Param1 : any; &Param2 : any )
Její parametry mají následující význam: Parametr | Význam |
---|
DriverName | je symbolické jméno ovladače, definované
v aplikaci. | Param1 | slouží k zadávání jmen konkrétních vnitřních
procedur ovladače, které provádějí specifickou činnost.
U jmen procedur je nutné dodržet správnou velikost
písmen. | Param2 | je použit jako parametr vnitřní procedury ovladače nebo
jako návratová hodnota procedury. Ve druhém případě musí být
před jméno parametru předepsán znak '&'. |
DriverName a Param1 se zadávají jako
textové řetězce. Param2 je různého typu podle významu
procedury.
Přehled a význam jednotlivých procedur ovladače (parametr Param1)
- SetHost
-
Pomocí této procedury se určí počítač (nebo jiné zařízení
komunikující po síti protokolem UDP nebo TCP), se kterým se
bude komunikovat. Zadává se buď jméno počítače nebo jeho IP
adresa a dále IP port, který bude pro komunikaci použit.
Parametr Param2 je typu string a
má tvar 'Name:IPPort' nebo 'IPAddress:IPPort'. Jméno
počítače bývá přiděleno správcem sítě. IP port by měl být
volen podle určitých pravidel podle dohody se správcem sítě.
Jestliže budeme experimentovat a vytvářet si vlastní síť,
můžeme se řídit doporučením, podle kterého mohou být
uživatelské porty vybírány z intervalu 5001 až 65535.
V případě, že zvolený IP port používá jiný program,
může dojít ke konfliktu. Chyba se pak projeví až
v rámci volání procedur Connect nebo
BindUDP. Pokud je zadáno jméno počítače,
ovladač si je sám převede na IP adresu a dále pracuje pouze
s ní.
Procedura SetHost je využitá jak
v režimu TCP klient, tak při UDP komunikaci. Ovladač si
parametry procedury uchová a používá je dále, dokud nedojde
k jejich změně opětovným voláním této procedury.
U TCP klienta slouží tyto parametry (jméno nebo IP
adresa a IP port) k vytvoření spojení (procedurou
Connect).
Při komunikaci UDP se parametry použijí dvojím způsobem.
Strana, která čeká na příjem dat použije IP adresu a port,
pro verifikaci (lépe řečeno filtraci) adresy a portu zdroje
dat. To znamená, že do aplikace propustí pouze data
z dané IP adresy a portu. Strana která vysílá, směruje
datové pakety na definovanou IP adresu a IP port. Je
samozřejmě možné, aby ovladač mohl data současně vysílat
i přijímat. V takovém případě musejí být
definovány IP porty dva. První, na kterém ovladač očekává
příchod dat (zadává se procedurou BindUDP
popsanou dále) a druhý na který se data posílají nebo odkud
se data přijímají - zadává se právě touto procedurou.
Pro testování komunikace nemusí být k dispozici obě
komunikující strany. S výhodou lze použít jediný
počítač, na kterém poběží oba programy, které mají spolu
komunikovat (u TCP klient i server, u UDP to jsou
např. dva tyto ovladače). Pak se může namísto IP adresy
všude nastavit lokální IP adresa 127.0.0.1 (převedená na
jméno je 'localhost'). Samozřejmě se dá nastavit
i aktuální jméno nebo IP adresa počítače.
- Connect
-
Procedura otevře TCP/IP spojení se serverem, který musí
být předem definovaný procedurou SetHost. Po
dokončení operace, ovladač generuje do aplikace výjimku.
Podle jejího statusu (procedura ReadStatus) se
dá zjistit jestli bylo spojení navázáno úspěšně nebo jestli
došlo k chybě. Parametr Param2 nemá
význam.
- BindUDP
-
Tato procedura vytvoří komunikační kanál na IP portu,
který se definuje parametrem Param2. Na tomto
portu pak ovladač přijímá data od vzdálených stanic. Podobně
jako u procedury Connect se po dokončení
operace generuje výjimka od ovladače.
- Disconnect
-
Zruší spojení vyvolané procedurou Connect
resp. uvolní komunikační kanál a IP port zabraný procedurou
BindUDP. Také vykonání této operace způsobí
výjimku od ovladače s příslušným statusem. Parametr
Param2 nemá význam.
- ReadStatus
-
Při zpracování výjimky od ovladače je velmi vhodné
zjistit její příčinu. K tomu slouží právě tato
procedura. Parametr Param2 vrátí status výjimky
s tímto významem:
Hodnota | Význam |
---|
0 | žádná výjimka. | 1 | došlo k chybě. Bližší určení chyby se dá
zjistit z chybového kódu, který vrátí procedura
ReadError. | 2 | spojení bylo navázáno. Procedura Connect
resp. BindUDP proběhla úspěšně. | 3 | výjimka signalizuje příjem dat. | 4 | výjimka signalizuje vyslání dat. | 5 | výjimka signalizuje ukončení spojení (TCP/IP) resp.
uvolnění komunikačního kanálu a IP portu (UDP). |
- ReadError
-
Vrátí chybový kód operace, když procedura ReadStatus
vrátila chybový stav výjimky od ovladače (hodnotu 1). Možné
chybové kódy jsou popsaný v kapitole Chybové kódy.
- EnableException
-
Procedura povolí vygenerování nové výjimky. Generuje-li
ovladač výjimku, aplikace ji zachytí a zpracuje. Po jejím
zpracování musí aplikace zavolat tuto proceduru, aby ovladač
při vzniku nové události vygeneroval další výjimku. To platí
i pro případ, že nová událost nastala
v průběhu zpracování aktuální výjimky od ovladače.
Parametr Param2 nemá význam.
- SetTimeout
-
Nastaví timeout v milisekundách pro čekání na data
(procedura Receive). Implicitní hodnota je 4000
milisekund (4 sekundy).
- Receive
-
Volání této procedury spustí synchronní příjem dat,
jinými slovy ovladač zahájí čekání na data od zařízení.
Maximální doba čekání je dána parametrem timeout, který se
nastavuje procedurou SetTimeout. Jestliže do
této doby ovladače přijme data, vznikne výjimka od ovladače
se stavem č.3. Jestliže žádná data nepřijdou, je po vypršení
timeoutu generována výjimka s chybovým stavem (č.1).
Parametr Param2 nemá význam.
- GetRxQueueBytes
-
Vrací aktuální počet byte ve vstupní frontě síťové vrstvy
v parametru Param2.
- ReadRxLen
-
Vrátí počet byte ve vstupním bufferu v parametru
Param2. Data do tohoto bufferu se přesouvají ze
vstupní fronty, když do ovladače přijdou data. Vstupní
buffer se ale přepisuje pouze, když byla zpracována
předchozí výjimka od ovladače (povolena procedurou EnableException).
Jinak se data hromadí ve vstupní frontě. Velikost této
fronty je dána síťovou vrstvou operačního systému a ovladač
ji nijak nenastavuje. Vstupní buffer ovladače má velikost
4096 byte.
- GetRxIPAdr
-
Procedura slouží ke zjištění IP adresy zdroje přijatých
dat v UDP komunikaci. Parametr Param2 musí
být typu longcard (velikost 4 byte). Každý jeho
byte představuje jednu skupinu IP adresy (0..255).
- GetRxIPAdrStr
-
Procedura slouží ke zjištění IP adresy zdroje přijatých
dat v UDP komunikaci. Parametr Param2
obsahuje adresu v "čitelné" podobě jako řetězec složený
ze čtyř čísel oddělených tečkami. Proto musí být typu string.
- GetRxIPPort
-
Procedura slouží ke zjištění IP portu zdroje přijatých
dat v UDP komunikaci. Parametr Param2 musí
být typu cardinal (velikost 2 byte).
- GetRxName
-
Procedura slouží ke zjištění jména počítače nebo
zařízení, které je zdrojem přijatých dat v UDP
komunikaci. Parametr Param2 obsahuje toto
jméno. Proto musí být typu string.
- ReadString
-
Přečte přijatý řetězec ze vstupního bufferu. Výsledek
vrátí v parametru Param2, který musí být
typu string.
- SetRxIndex
-
Procedura slouží k nastavení indexu ve vstupním
bufferu, od kterého se pak budou číst data (jednotlivé
položky) pomocí procedur GetInt8, GetUint8
atd. Parametr Param2 je číselného typu a
předává požadovaný index.
- GetInt8
-
Přečte ze vstupního bufferu datovou položku
o velikosti 1 byte a předá ji v parametru Param2
jako celé číslo se znaménkem. Index ve vstupním bufferu se
automaticky zvýší o 1, takže je možno ve čtení
pokračovat bez nutnosti volání procedury SetRxIndex.
- GetUint8
-
Přečte ze vstupního bufferu datovou položku
o velikosti 1 byte a předá ji v parametru Param2
jako celé číslo bez znaménka. Index ve vstupním bufferu se
automaticky zvýší o 1, takže je možno ve čtení
pokračovat bez nutnosti volání procedury SetRxIndex.
- GetInt16
-
Přečte ze vstupního bufferu datovou položku
o velikosti 2 byte a předá ji v parametru Param2
jako celé číslo se znaménkem. Index ve vstupním bufferu se
automaticky zvýší o 2, takže je možno ve čtení
pokračovat bez nutnosti volání procedury SetRxIndex.
- GetUint16
-
Přečte ze vstupního bufferu datovou položku
o velikosti 2 byte a předá ji v parametru Param2
jako celé číslo bez znaménka. Index ve vstupním bufferu se
automaticky zvýší o 2, takže je možno ve čtení
pokračovat bez nutnosti volání procedury SetRxIndex.
- GetInt32
-
Přečte ze vstupního bufferu datovou položku
o velikosti 4 byte a předá ji v parametru Param2
jako celé číslo se znaménkem. Index ve vstupním bufferu se
automaticky zvýší o 4, takže je možno ve čtení
pokračovat bez nutnosti volání procedury SetRxIndex.
- GetUint32
-
Přečte ze vstupního bufferu datovou položku
o velikosti 4 byte a předá ji v parametru Param2
jako celé číslo bez znaménka. Index ve vstupním bufferu se
automaticky zvýší o 4, takže je možno ve čtení
pokračovat bez nutnosti volání procedury SetRxIndex.
- GetFloat
-
Přečte ze vstupního bufferu datovou položku
o velikosti 4 byte a předá ji v parametru Param2
jako číslo s plovoucí řádovou čárkou. Index ve vstupním
bufferu se automaticky zvýší o 4, takže je možno ve
čtení pokračovat bez nutnosti volání procedury SetRxIndex.
- GetDouble
-
Přečte ze vstupního bufferu datovou položku
o velikosti 8 byte a předá ji v parametru Param2
jako číslo s plovoucí řádovou čárkou. Index ve vstupním
bufferu se automaticky zvýší o 8, takže je možno ve
čtení pokračovat bez nutnosti volání procedury SetRxIndex.
- SendString
-
Vyšle textový řetězec přes otevřené spojení (TCP/IP) nebo
na zadanou IP adresu a IP port (UDP) určený procedurou
SetHost. Parametr Param2 obsahuje
řetězec, který má být vyslán. Po odeslání řetězce generuje
ovladač výjimku. Maximální délka řetězce je 4096 znaků.
- SetTxIndex
-
Procedura slouží k nastavení indexu ve výstupním
bufferu, od kterého se pak budou zapisovat data (jednotlivé
položky) pomocí procedur SetInt8, SetUint8
atd. Parametr Param2 je číselného typu a
předává požadovaný index.
- PutInt8
-
Zapíše hodnotu předanou parametrem Param2
do výstupního bufferu jako celé číslo se znaménkem
o velikosti 1 byte. Index ve výstupním bufferu se
automaticky zvýší o 1, takže je možno v zápisu
pokračovat bez nutnosti volání procedury SetTxIndex.
- PutUint8
-
Zapíše hodnotu předanou parametrem Param2
do výstupního bufferu jako celé číslo bez znaménka
o velikosti 1 byte. Index ve výstupním bufferu se
automaticky zvýší o 1, takže je možno v zápisu
pokračovat bez nutnosti volání procedury SetTxIndex.
- PutInt16
-
Zapíše hodnotu předanou parametrem Param2
do výstupního bufferu jako celé číslo se znaménkem
o velikosti 2 byte. Index ve výstupním bufferu se
automaticky zvýší o 2, takže je možno v zápisu
pokračovat bez nutnosti volání procedury SetTxIndex.
- PutUint16
-
Zapíše hodnotu předanou parametrem Param2
do výstupního bufferu jako celé číslo bez znaménka
o velikosti 2 byte. Index ve výstupním bufferu se
automaticky zvýší o 2, takže je možno v zápisu
pokračovat bez nutnosti volání procedury SetTxIndex.
- PutInt32
-
Zapíše hodnotu předanou parametrem Param2
do výstupního bufferu jako celé číslo se znaménkem
o velikosti 4 byte. Index ve výstupním bufferu se
automaticky zvýší o 4, takže je možno v zápisu
pokračovat bez nutnosti volání procedury SetTxIndex.
- PutUint32
-
Zapíše hodnotu předanou parametrem Param2
do výstupního bufferu jako celé číslo bez znaménka
o velikosti 4 byte. Index ve výstupním bufferu se
automaticky zvýší o 4, takže je možno v zápisu
pokračovat bez nutnosti volání procedury SetTxIndex.
- PutFloat
-
Zapíše hodnotu předanou parametrem Param2
do výstupního bufferu jako číslo s plovoucí řádovou
čárkou o velikosti 4 byte. Index ve výstupním bufferu
se automaticky zvýší o 4, takže je možno v zápisu
pokračovat bez nutnosti volání procedury SetTxIndex.
- PutDouble
-
Zapíše hodnotu předanou parametrem Param2
do výstupního bufferu jako číslo s plovoucí řádovou
čárkou o velikosti 8 byte. Index ve výstupním bufferu
se automaticky zvýší o 8, takže je možno v zápisu
pokračovat bez nutnosti volání procedury SetTxIndex.
- Send
-
Vyšle data z výstupního bufferu přes otevřené
spojení (TCP/IP) nebo na zadanou IP adresu a IP port (UDP)
určený procedurou SetHost. Parametr Param2
obsahuje délku výstupního bufferu, který má být vyslán. Po
odeslání bufferu generuje ovladač výjimku. Výstupní buffer
je blok paměti, kterou spravuje ovladač. Má velikost 4096
byte a k jeho naplnění slouží procedury SetTxIndex,
PutInt8, PutUint8, PutInt16,
PutUint16, PutInt32, PutUint32,
PutFloat a PutDouble .
Parametry ovladače
Ovladač nevyžaduje žádný soubor parametrů (PAR).
V aplikaci Control Web je možno použít
libovolný (prázdný soubor).
Kanály ovladače
Ovladač nedisponuje žádnými kanály. Veškerý přenos dat se děje
prostřednictvím volání procedur ovladače.
Mapovací soubor ovladače a datové typy
Ovladač nevyžaduje žádný mapovací soubor (DMF). V aplikaci
Control Web je možno použít libovolný (prázdný
soubor).
Zpracování a stavy výjimek ovladače
Některé procedury způsobí po svém vykonání vznik události,
která vede na vyvolání výjimky od ovladače. Pro zachycení výjimky
od ovladače musí být v aplikaci definován objekt (virtuální
přístroj), který má parametr driver_exception se
symbolickým jménem tohoto ovladače. Pak bude při vzniku události
tento přístroj výjimkou aktivován, to znamená že se vyvolá jeho
procedura OnActivate.
Po zavolání procedury, která pouze zahájí nějakou akci (např.
spojování) by se mělo v aplikaci počkat na její dokončení. To
se pozná právě tím, že ovladač vyvolá novou výjimku. Teprve až
v rámci zpracování této výjimky je možno volat další
procedury ovladače.
Jelikož může dojít k nahromadění asynchronních zpráv
v přijímacím bufferu, je nutné aby ovladač generoval
následující výjimky, které povedou k postupnému vyčítání
přijímacího bufferu až poté, co se zpracuje výjimka předchozí.
Proto ovladač po vygenerování výjimky čeká na její potvrzení od
aplikace. K tomuto potvrzení slouží procedura EnableException.
Tu je vhodné zavolat až na konci procedury OnActivate
virtuálního přístroje (typicky programu), který výjimky od
ovladače zpracovává.
Jakmile nastane výjimka od ovladače, vyvolá se procedura OnActivate
toho přístroje, který ji má zaregistrovanou. Pomocí procedury
ReadStatus je možno zjistit příčinu výjimky a podle
toho ji zpracovat.
Kódy pro stavy výjimek ovladače
Hodnota | Význam |
---|
0 | žádná výjimka od ovladače. | 1 | výjimka signalizuje chybu. Volání procedury ReadError
vrátí chybový kód. | 2 | výjimka signalizuje navázání spojení. | 3 | signalizace příjmu dat. Ovladač přečte data, která je
možno získat buď procedurou ReadString nebo
postupným voláním procedur GetInt8, GetUint8
atd. Počet přečtených znaků (byte) se získá voláním
procedury ReadRxLen. Celkový počet přijatých
znaků ve vstupním bufferu (ve frontě) se dá zjistit voláním
procedury GetRxQueueBytes. Při události
(výjimce) od příjmu je také možno identifikovat zdroj dat -
v režimu UDP. IP adresa se získá voláním procedury
GetRxIPAdr nebo GetRxIPAdrStr,
popřípadě jméno počítače pomocí procedury GetRxName.
IP port se získá voláním procedury GetRxIPPort. | 4 | signalizace vyslání dat a uvolnění výstupního
bufferu | 5 | signalizace, že zařízení je odpojeno. |
Chybové kódy
Ovladač generuje následující chybové kódy.
Kódy definované systémem Control Web: Hodnota | Význam |
---|
0 | úspěšná operace | 1 | chyba timeoutu | 2 | neplatná hodnota | 3 | neexistující kanál |
Specifické chybové kódy ovladače: Hodnota | Význam |
---|
1000 | chyba spojení | 1001 | chyba při příjmu dat | 1002 | chyba při vysílání dat |
Chybové kódy od 10000 nahoru jsou kódy síťové vrstvy
operačního systému (popis je uveden v anglickém
jazyce): Hodnota | Význam |
---|
10004 | Interrupted function call. This error is returned when a
socket is closed or a process is terminated, on a pending
Winsock operation for that socket. | 10013 | Permission denied. An attempt was made to access a socket
in a way forbidden by its access permissions. | 10014 | Bad address. The system detected an invalid pointer
address in attempting to use a pointer argument of a call. This
error occurs if an application passes an invalid pointer value,
or if the length of the buffer is too small. For instance, if
the length of an argument, which is a sockaddr structure, is
smaller than the sizeof(SOCKADDR). | 10022 | Invalid argument. Some invalid argument was supplied (for
example, specifying an invalid level to the setsockopt (Windows
Sockets) function). In some instances, it also refers to the
current state of the socket — for instance, calling accept
(Windows Sockets) on a socket that is not listening. | 10024 | Too many open files. Too many open sockets. Each
implementation may have a maximum number of socket handles
available, either globally, per process, or per thread. | 10035 | Resource temporarily unavailable. This error is returned
from operations on nonblocking sockets that cannot be completed
immediately, for example recv when no data is queued to be read
from the socket. It is a nonfatal error, and the operation
should be retried later. It is normal for WSAEWOULDBLOCK to be
reported as the result from calling connect (Windows Sockets) on
a nonblocking SOCK_STREAM socket, since some time must elapse
for the connection to be established. | 10036 | Operation now in progress. A blocking operation is
currently executing. Windows Sockets only allows a single
blocking operation — per task or thread — to be outstanding, and
if any other function call is made (whether or not it references
that or any other socket) the function fails with the
WSAEINPROGRESS error. | 10037 | Operation already in progress. An operation was attempted
on a nonblocking socket with an operation already in progress —
that is, calling connect a second time on a nonblocking socket
that is already connecting, or canceling an asynchronous request
(WSAAsyncGetXbyY) that has already been canceled or
completed. | 10038 | Socket operation on nonsocket. An operation was attempted
on something that is not a socket. Either the socket handle
parameter did not reference a valid socket, or for the select
function, a member of an fd_set structure was not
valid. | 10039 | Destination address required. A required address was
omitted from an operation on a socket. For example, this error
is returned if sendto is called with the remote address of
ADDR_ANY. | 10040 | Message too long. A message sent on a datagram socket was
larger than the internal message buffer or some other network
limit, or the buffer used to receive a datagram was smaller than
the datagram itself. | 10041 | Protocol wrong type for socket. A protocol was specified
in the socket function call that does not support the semantics
of the socket type requested. For example, the ARPA Internet UDP
protocol cannot be specified with a socket type of
SOCK_STREAM. | 10042 | Bad protocol option. An unknown, invalid or unsupported
option or level was specified in a getsockopt (Windows Sockets)
or setsockopt (Windows Sockets) call. | 10043 | Protocol not supported. The requested protocol has not
been configured into the system, or no implementation for it
exists. For example, a socket call requests a SOCK_DGRAM socket,
but specifies a stream protocol. | 10044 | Socket type not supported. The support for the specified
socket type does not exist in this address family. For example,
the optional type SOCK_RAW might be selected in a socket call,
and the implementation does not support SOCK_RAW sockets at all.
Also, this error code maybe returned for SOCK_RAW if the caller
application is not privileged. | 10045 | Operation not supported. The attempted operation is not
supported for the type of object referenced. Usually this occurs
when a socket descriptor to a socket that cannot support this
operation is trying to accept a connection on a datagram
socket. | 10046 | Protocol family not supported. The protocol family has
not been configured into the system or no implementation for it
exists. This message has a slightly different meaning from
WSAEAFNOSUPPORT. However, it is interchangeable in most cases,
and all Windows Sockets functions that return one of these
messages also specify WSAEAFNOSUPPORT. | 10047 | Address family not supported by protocol family. An
address incompatible with the requested protocol was used. All
sockets are created with an associated address family (that is,
AF_INET for Internet protocols) and a generic protocol type
(that is, SOCK_STREAM). This error is returned if an incorrect
protocol is explicitly requested in the socket call, or if an
address of the wrong family is used for a socket, for example,
in sendto. | 10048 | Address already in use. Typically, only one usage of each
socket address (protocol/IP address/port) is permitted. This
error occurs if an application attempts to bind a socket to an
IP address/port that has already been used for an existing
socket, or a socket that was not closed properly, or one that is
still in the process of closing. For server applications that
need to bind multiple sockets to the same port number, consider
using setsockopt (Windows Sockets)(SO_REUSEADDR). Client
applications usually need not call bind at all — connect chooses
an unused port automatically. When bind is called with a
wildcard address (involving ADDR_ANY), a WSAEADDRINUSE error
could be delayed until the specific address is committed. This
could happen with a call to another function later, including
connect, listen, WSAConnect, or WSAJoinLeaf. | 10049 | Cannot assign requested address. The requested address is
not valid in its context. This normally results from an attempt
to bind to an address that is not valid for the local machine.
This can also result from connect (Windows Sockets), sendto,
WSAConnect, WSAJoinLeaf, or WSASendTo when the remote address or
port is not valid for a remote machine (for example, address or
port 0). | 10050 | Network is down. A socket operation encountered a dead
network. This could indicate a serious failure of the network
system (that is, the protocol stack that the Windows Sockets DLL
runs over), the network interface, or the local network
itself. | 10051 | Network is unreachable. A socket operation was attempted
to an unreachable network. This usually means the local software
knows no route to reach the remote host. | 10052 | Network dropped connection on reset. The connection has
been broken due to keep-alive activity detecting a failure while
the operation was in progress. It can also be returned by
setsockopt (Windows Sockets) if an attempt is made to set
SO_KEEPALIVE on a connection that has already failed. | 10053 | Software caused connection abort. An established
connection was aborted by the software in your host machine,
possibly due to a data transmission time-out or protocol
error. | 10054 | Connection reset by peer. An existing connection was
forcibly closed by the remote host. This normally results if the
peer application on the remote host is suddenly stopped, the
host is rebooted, or the remote host uses a hard close (see
setsockopt (Windows Sockets) for more information on the
SO_LINGER option on the remote socket.) This error may also
result if a connection was broken due to keep-alive activity
detecting a failure while one or more operations are in
progress. Operations that were in progress fail with
WSAENETRESET. Subsequent operations fail with
WSAECONNRESET. | 10055 | No buffer space available. An operation on a socket could
not be performed because the system lacked sufficient buffer
space or because a queue was full. | 10056 | Socket is already connected. A connect request was made
on an already-connected socket. Some implementations also return
this error if sendto is called on a connected SOCK_DGRAM socket
(for SOCK_STREAM sockets, the to parameter in sendto is ignored)
although other implementations treat this as a legal
occurrence. | 10056 | Socket is already connected. A connect request was made
on an already-connected socket. Some implementations also return
this error if sendto is called on a connected SOCK_DGRAM socket
(for SOCK_STREAM sockets, the to parameter in sendto is ignored)
although other implementations treat this as a legal
occurrence. | 10057 | Socket is not connected. A request to send or receive
data was disallowed because the socket is not connected and
(when sending on a datagram socket using sendto) no address was
supplied. Any other type of operation might also return this
error — for example, setsockopt (Windows Sockets) setting
SO_KEEPALIVE if the connection has been reset. | 10058 | Cannot send after socket shutdown. A request to send or
receive data was disallowed because the socket had already been
shut down in that direction with a previous shutdown call. By
calling shutdown a partial close of a socket is requested, which
is a signal that sending or receiving, or both have been
discontinued. | 10060 | Connection timed out. A connection attempt failed because
the connected party did not properly respond after a period of
time, or the established connection failed because the connected
host has failed to respond. | 10060 | Connection timed out. A connection attempt failed because
the connected party did not properly respond after a period of
time, or the established connection failed because the connected
host has failed to respond. | 10061 | Connection refused. No connection could be made because
the target machine actively refused it. This usually results
from trying to connect to a service that is inactive on the
foreign host — that is, one with no server application
running. | 10064 | Host is down. A socket operation failed because the
destination host is down. A socket operation encountered a dead
host. Networking activity on the local host has not been
initiated. These conditions are more likely to be indicated by
the error WSAETIMEDOUT. | 10065 | No route to host. A socket operation was attempted to an
unreachable host. See WSAENETUNREACH. | 10067 | Too many processes. A Windows Sockets implementation may
have a limit on the number of applications that can use it
simultaneously. WSAStartup may fail with this error if the limit
has been reached. | 10091 | Network subsystem is unavailable. This error is returned
by WSAStartup if the Windows Sockets implementation cannot
function at because the underlying system it uses to provide
network services is currently unavailable. Users should check:
That the appropriate Windows Sockets DLL file is in the current
path. That they are not trying to use more than one Windows
Sockets implementation simultaneously. If there is more than one
Winsock DLL on your system, be sure the first one in the path is
appropriate for the network subsystem currently loaded. The
Windows Sockets implementation documentation to be sure all
necessary components are currently installed and configured
correctly. | 10092 | Winsock.dll version out of range. The current Windows
Sockets implementation does not support the Windows Sockets
specification version requested by the application. Check that
no old Windows Sockets DLL files are being accessed. | 10093 | Successful WSAStartup not yet performed. Either the
application has not called WSAStartup or WSAStartup failed. The
application may be accessing a socket that the current active
task does not own (that is, trying to share a socket between
tasks), or WSACleanup has been called too many times. | 10101 | Graceful shutdown in progress. Returned by WSARecv and
WSARecvFrom to indicate that the remote party has initiated a
graceful shutdown sequence. | 10109 | Class type not found. The specified class was not
found. | 11001 | Host not found. No such host is known. The name is not an
official host name or alias, or it cannot be found in the
database(s) being queried. This error may also be returned for
protocol and service queries, and means that the specified name
could not be found in the relevant database. | 11002 | Nonauthoritative host not found. This is usually a
temporary error during host name resolution and means that the
local server did not receive a response from an authoritative
server. A retry at some time later may be successful. | 11003 | This is a nonrecoverable error. This indicates some sort
of nonrecoverable error occurred during a database lookup. This
may be because the database files (for example, BSD-compatible
HOSTS, SERVICES, or PROTOCOLS files) could not be found, or a
DNS request was returned by the server with a severe
error. | 11004 | Valid name, no data record of requested type. The
requested name is valid and was found in the database, but it
does not have the correct associated data being resolved
for. |
Příklad použití ovladače
Součástí instalace je jednoduchý příklad použití ovladače.
Tento příklad naleznete v adresáři
'CWSODRV\EXAMPLES\'.
|