The following Winsock Error codes can be recorded by MDaemon to report socket failures. The code descriptions are detailed below followed by why these socket errors may occur in MDaemon.
WSAEADDRNOTAVAIL
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 computer. This can also result from connect, sendto, WSAConnect, WSAJoinLeaf, or WSASendTo when the remote address or port is not valid for a remote computer (for example, address or port 0).
Winsock 10049 typically occurs when MDaemon is configured to bind an invalid or non-existent IP address.
WSAECONNABORTED
10053
Software caused connection abort.
An established connection was aborted by the software in your host computer, possibly due to a data transmission time-out or protocol error.
WSAECONNRESET
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, the host or remote network interface is disabled, or the remote host uses a hard close (see setsockopt 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
WSAETIMEDOUT
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.
WSAECONNREFUSED
10061
Connection refused.
No connection could be made because the target computer 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.
As you would expect, error codes, like socket functions, have a UNIX pedigree. The list of errors and their brief descriptions are in Appendix B. As well as that pedigree, we have Winsock-specific error codes resulting in a hybrid. If you examine Winsock2.pas, you will see two blocks of error codes that begin with WSA and E prefixes. These refer to Winsock and Berkeley error codes, respectively. The Berkeley error codes are mapped to their Winsock equivalents. This mapping is rather useful for UNIX developers porting their socket applications to Windows. Thankfully, this detail is irrelevant to Delphi developers.
Rather than listing what’s common to Winsock and UNIX socket error codes, the following list shows Winsock-specific error codes not found in UNIX. We will describe some of these errors in detail when we discuss the Winsock functions in the chapters to follow. Note that we will not discuss Quality of Service (error codes from WSA_QOS_RECEIVERS to and including WSA_QOS_ RESERVED_PETYPE), as this is a topic for another tome.
WSASYSNOTREADY
WSAVERNOTSUPPORTED
WSANOTINITIALISED
WSAEDISCON
WSAENOMORE
WSAECANCELLED
WSAEINVALIDPROCTABLE
WSAEINVALIDPROVIDER
WSAEPROVIDERFAILEDINIT
WSASYSCALLFAILURE
WSASERVICE_NOT_FOUND
WSATYPE_NOT_FOUND
WSA_E_NO_MORE
WSA_E_CANCELLED
WSAEREFUSED
WSA QOS RECEIVERS
WSA_QOS_SENDERS
WSA_QOS_NO_SENDERS
WSA_QOS_NO_RECEIVERS
WSA_QOS_REQUEST_CONFIRMED
WSA_QOS_ADMISSION_FAILURE
WSA_QOS_POLICY_FAILURE
WSA_QOS_BAD_STYLE
WSA_QOS_BAD_OBJECT
WSA_QOS_TRAFFIC_CTRL_ERROR
WSA_QOS_GENERIC_ERROR
WSA_QOS_ESERVICETYPE
WSA_QOS_EFLOWSPEC
WSA_QOS_EPROVSPECBUF
WSA_QOS_EFILTERSTYLE
WSA_QOS_EFILTERTYPE
WSA QOS EFILTERCOUNT
WSA_QOS_EOBJLENGTH
WSA_QOS_EFLOWCOUNT
WSA_QOS_EUNKOWNPSOBJ
WSA_QOS_EPSFLOWSPEC WSA_QOS_EPSFILTERSPEC WSA_QOS_ESDMODEOBJ WSA_QOS_ESHAPERATEOBJ
WSA_QOS_EPOLICYOBJ WSA_QOS_EFLOWDESC
WSA_QOS_RESERVED_PETYPE
Before concluding this section, here is a final word to the wise about error codes: It is all very well for your application to handle Winsock exceptions and report error codes as they arise. Your Winsock application should also present exceptions in plain language as well as the actual error code for ease of error reporting for the user. In the examples in this book, we use SysErrorMessage(), a function that translates error codes into plain language that your user will hopefully understand. The sting in the tail with this function is that it doesn’t work across all Windows platforms. The SysErrorMessage() function works fine on Windows 2000 but reports an empty string on Windows NT 4.0.
TIP: Use SysErrorMessage() to present a meaningful explanation of Winsock errors to your users.
Listing 2-3 demonstrates how to use SysErrorMessage().
function WSAGetLastError Winsock2.pas
Syntax
WSAGetLastError: Integer; stdcall; Description
This function retrieves the error status for the last network operation that failed.
Parameters
None
Return Value
The return value indicates the error code for the last operation that failed. See Also getsockopt, WSASetLastError Example
Listing 2-2 (program EX22) shows how to use WSAGetLastError().
Listing 2-2: Using WSAGetLastError()
{This example demonstrates how to use WSAGetLastError function. To create an artificial error, we set the size of the Name array to zero before calling the function gethostname(), which will cause Winsock to report a bad address due to an insufficient allocation to store the name. We will examine the gethostname() function later in the book.
No inputs are required for this console application.
program EX22;
{$APPTYPE CONSOLE}
uses SysUtils, Winsock2;
WSAData : TWSAData; Res : Integer; begin if WSAStartUp($101, WSAData) = 0 then try
Res := gethostname(‘127.0.0.1’,0); // this will always fail …
if Res = Integer(SOCKET_ERROR) then begin
WriteLn(Format(‘Call to gethostname() failed with error: %d’,[WSAGetLastError])); WriteLn(Format(‘Reason for the error is: %s’,[SysErrorMessage(WSAGetLastError)])); end; finally WSACleanUp; end else
WriteLn(‘Failed to load Winsock.’); end.
procedure WSASetLastError Winsock2.pas
Syntax
WSASetLastError (¡Error: Integer); stdcall; Description
The function sets the error code that can be retrieved through the WSAGetLastError() function.
Parameters iError: Integer that specifies the error code to be returned by a subsequent WSAGetLastError() call
Return Value
There is no return value. See Also getsockopt, WSAGetLastError
Example
Listing 2-3 (program EX23) shows how to use WSASetLastError() and WSAGetLastError().
Listing 2-3: Using WSASetLastError() and WSAGetLastError()
- This contrived example demonstrates how to use the WSASetLastError() function} program EX23;
- APPTYPE CONSOLE}
uses Dialogs, SysUtils, Winsock2;
WSAData : TWSAData; Res,
OldError : Integer; begin if WSAStartUp($101, WSAData) = 0 then try
// Create a virtual error, any old error code will do nicely … OldError := 10061; WSASetLastError(OldError);
WriteLn(Format(‘Virtual error is: %d’,[WSAGetLastError]));
WriteLn(Format(‘Reason for the virtual error is: %s’,[SysErrorMessage(WSAGetLastError)])); // Now create an artificial error …
Res := gethostname(‘127.0.0.1’,0); // This will always fail as length of the name is zero…
if Res = Integer(SOCKET_ERROR) then begin
WriteLn(‘An Artificial Error:’);
WriteLn(Format(‘Call to gethostname() failed with error: %d’,[WSAGetLastError])); WriteLn(Format(‘Reason for the error is: %s’,[SysErrorMessage(WSAGetLastError)])); WriteLn;
WriteLn(Format(‘The virtual error is %d’, [OldError])); WSASetlastError(OldError);
WriteLn(Format(‘Reason for the virtual error is: %s’,[SysErrorMessage(WSAGetLastError)])); end; finally WSACleanUp; end else
WriteLn(‘Failed to load Winsock.’); end.
Continue reading here: The Many Faces of the Winsock DLL
Was this article helpful?
Код
описание сущности ошибки
прервано вызовом специальной функции.
на доступ к сокету.
указателя при вызове функции.
аргумент при вызове функции для работы
с сокетами.
открытых сокетов на нить, процесс или
глобальных.
недоступен, при выполнении функции
работы с сокетом, которая не может
выполнить операцию немедленно.
операция сейчас уже выполняется.
неблокирующим сокетом уже
выполняется.
функцию, работающую с сокетами, при
передаче ей в аргументе значения,
которое не является правильным
значением сокета. Обычно возникает, при
попытке работы с уже закрытым
сокетом.
назначения
длинное при передаче дейтаграммы.
поддерживается для данного сокета.
или уровень заданы в функциях опций
сокетов
протокол не сконфигурирован для работы
с системе
поддерживается
не поддерживается
протоколов не поддерживается
поддерживается на выбранном протоколе
сокета
используется на этом хосте. Очень
распространённая ошибка, когда две
программы-серверы пытаются
использовать один и тот же порт для
приема запросов клиентов.
использовать запрошенный адрес для
привязки в порту
неработоспособна
аппаратура не знает как туда переслать
пакет, возможно из-за ненастроенной
маршрутизации.
разорвано из-за сбоя при выполнении
операции
обеспечение компьютера, на котором
выполняется данная программа,
разорвало соединение.
разорвано с удаленного компьютера,
возможно, что так оно и задумано было, и
клиент завершил всю передачу
информации по сокету.
очереди.
подсоединен.
подсоединенный
или получить данные по сокету, из-за того,
что эта операция уже запрещена
функцией shutdown
отказал в соединении, возможно не нём
не запущен соответствующая программа
сервер.
производится попытка соединения
выключен.
компьютеру не найдет маршрут пересылки
пакетов.
много процессов, использующих Windows Socket
недоступна.
winsock.dll
WSAStartup перед использованием любой
другой фукнции работы с сокетами.
класса не найден.
инициировал завершение соединения
компьютера не найдено
разрешении имени компьютера в адрес,
возможно её не будет при повторе
операции через некоторое время.
ошибка при разрешении имени в адрес.
компьютера не связано никакой
правильной информации об адресе, хотя
само имя присутствует в соответствующих
базах данных имён.
Все
ошибки, которые происходят
при соединениях с
серверами и клиентами в
процессе работы программы
BSB регистрируются, как и
многие другие моменты
работы, в файле-журнале bsb.log.
Но в целях упрощения в
журнал пишутся только коды
ошибок, а не их текстовое
описание. Аналогично
обстоит ситуация и с
клиентской программой «BSB Client Informer»
— она выдает номер ошибки.
Программа BSB для связи
по протоколу TCP/IP
использует библиотеку Windows
Sockets, и далее приведено
очень краткое текстовое
описание на русском языке
кодов тех ошибок, которые
могут возникать при работе
с функциями этой
библиотеки WinSocks.
Код |
Краткое описание сущности ошибки |
10004 | Выполнение операции с сокетом, блокирующей выполнение программы, прервано вызовом специальной функции. |
10013 | Нет разрешения на доступ к сокету. |
10014 | Неверный адрес указателя при вызове функции. |
10022 | Неправильный аргумент при вызове функции для работы с сокетами. |
10024 | Слишком много открытых сокетов на нить, процесс или глобальных. |
10035 | Ресурс временно недоступен, при выполнении функции работы с сокетом, которая не может выполнить операцию немедленно. |
10036 | Одна блокирующая операция сейчас уже выполняется. |
10037 | Одна операция с неблокирующим сокетом уже выполняется. |
10038 | Попытка вызвать функцию, работающую с сокетами, при передаче ей в аргументе значения, которое не является правильным значением сокета. Обычно возникает, при попытке работы с уже закрытым сокетом. |
10039 | Требуется адрес назначения |
10040 | Сообщение слишком длинное при передаче дейтаграммы. |
10041 | Тип протокол не поддерживается для данного сокета. |
10042 | Неправильная опция или уровень заданы в функциях опций сокетов |
10043 | Запрошенный протокол не сконфигурирован для работы с системе |
10044 | Тип сокета не поддерживается |
10045 | Операция с сокетом не поддерживается |
10046 | Семейство протоколов не поддерживается |
10047 | Адрес не поддерживается на выбранном протоколе сокета |
10048 | Адрес+порт уже используется на этом хосте. Очень распространённая ошибка, когда две программы-серверы пытаются использовать один и тот же порт для приема запросов клиентов. |
10049 | Невозможно использовать запрошенный адрес для привязки в порту |
10050 | Сеть неработоспособна |
10051 | Сеть недоступна, аппаратура не знает как туда переслать пакет, возможно из-за ненастроенной маршрутизации. |
10052 | Соединение разорвано из-за сбоя при выполнении операции |
10053 | Программное обеспечение компьютера, на котором выполняется данная программа, разорвало соединение. |
10054 | Соединение разорвано с удаленного компьютера, возможно, что так оно и задумано было, и клиент завершил всю передачу информации по сокету. |
10055 | Не места в буфере или очереди. |
10056 | Сокет уже подсоединен. |
10057 | Сокет не подсоединенный |
10058 | Невозможно послать или получить данные по сокету, из-за того, что эта операция уже запрещена функцией shutdown |
10060 | Timeout |
10061 | Удаленный компьютер отказал в соединении, возможно не нём не запущен соответствующая программа сервер. |
10064 | Компьютер, с которым производится попытка соединения выключен. |
10065 | К удаленному компьютеру не найдет маршрут пересылки пакетов. |
10067 | Запущено слишком много процессов, использующих Windows Socket |
10091 | Сетевая подсистема недоступна. |
10092 | Неверная версия winsock.dll |
10093 | Не выполнена функция WSAStartup перед использованием любой другой фукнции работы с сокетами. |
10109 | Запрошенный тип класса не найден. |
10101 | Удаленный компьютер инициировал завершение соединения |
11001 | Запрошенное имя компьютера не найдено |
11002 | Временная ошибка при разрешении имени компьютера в адрес, возможно её не будет при повторе операции через некоторое время. |
11003 | Невосстанавливаемая ошибка при разрешении имени в адрес. |
11004 | С запрошенным именем компьютера не связано никакой правильной информации об адресе, хотя само имя присутствует в соответствующих базах данных имён. |