Сделан запрос на подключение для уже подключенного сокета

Обновлено: 04.07.2024

Здрасте, а как получить текстовую форму: ErrorCode;
помоему была какая-то функция, но я не помню

The type for event handlers that respond when a Windows socket reports an error.

TErrorEvent = (eeGeneral, eeSend, eeReceive, eeConnect, eeDisconnect, eeAccept);

TSocketErrorEvent = procedure (Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer) of object;

The Sender parameter is the socket component that encountered the error.

The Socket parameter is the TCustomWinSocket object that receives the error notification.

The ErrorCode parameter is the error code returned by the Windows socket API call. Changing this to 0 within an error handler prevents an exception from being raised.

The ErrorEvent parameter indicates what Socket was attempting to do when the error occurred. It is of type TErrorEvent, which can have any of the following values:

eeGeneral The socket received an error message that does not fit into any of the following categories.
eeSend An error occurred when trying to write to the socket connection.
eeReceive An error occurred when trying to read from the socket connection.
eeConnect A connection request that was already accepted could not be completed.
eeDisconnect An error occurred when trying to close a connection.
eeAccept A problem occurred when trying to accept a client connection request.

приведи пример
это может работать не на всех платформах или работать некорректно
в противном случае этим давно бы воспользовался Борланд, как известно - старательно придерживающийся устойчивых платформ/версий/технологий

>это может работать не на всех платформах или работать некорректно
в противном случае этим давно бы воспользовался Борланд, как известно - старательно придерживающийся устойчивых платформ/версий/технологий

Функция примерно такая:

function GetError(const ErrorCode: DWORD): String;
var
i: DWORD;
begin
Result := "Not found error code";
for i := Low(ErrCode) to High(ErrCode) do
begin
if ErrorCode= ErrCode[i] then
begin
Result := ErrText[i];
Exit;
end;
end;
end;

в отдельном модуле:

const ErrCode: array[1..90] of Integer=(
10004,10009,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,10059,10060,
10061,10062,10063,10064,10065,10066,10067,10068,
10069,10070,10071,10091,10092,10093,10101,10102,
10103,10104,10105,10106,10107,10108,10109,10110,
10111,10112,11001,11002,11003,11004,11005,11006,
11007,11008,11009,11010,11011,11012,11013,11014,
11015,11016,11017,11018,11019,11020,11021,11022,
11023,11024,11025,11026,11027,11028,11029,11030,
11031,
const WSAEINTR =10004;
const WSAEBADF =10009;
const WSAEACCES =10013;
const WSAEFAULT =10014;
const WSAEINVAL =10022;
const WSAEMFILE =10024;
const WSAEWOULDBLOCK =10035;
const WSAEINPROGRESS =10036;
const WSAEALREADY =10037;
const WSAENOTSOCK =10038;
const WSAEDESTADDRREQ =10039;
const WSAEMSGSIZE =10040;
const WSAEPROTOTYPE =10041;
const WSAENOPROTOOPT =10042;
const WSAEPROTONOSUPPORT =10043;
const WSAESOCKTNOSUPPORT =10044;
const WSAEOPNOTSUPP =10045;
const WSAEPFNOSUPPORT =10046;
const WSAEAFNOSUPPORT =10047;
const WSAEADDRINUSE =10048;
const WSAEADDRNOTAVAIL =10049;
const WSAENETDOWN =10050;
const WSAENETUNREACH =10051;
const WSAENETRESET =10052;
const WSAECONNABORTED =10053;
const WSAECONNRESET =10054;
const WSAENOBUFS =10055;
const WSAEISCONN =10056;
const WSAENOTCONN =10057;
const WSAESHUTDOWN =10058;
const WSAETOOMANYREFS =10059;
const WSAETIMEDOUT =10060;
const WSAECONNREFUSED =10061;
const WSAELOOP =10062;
const WSAENAMETOOLONG =10063;
const WSAEHOSTDOWN =10064;
const WSAEHOSTUNREACH =10065;
const WSAENOTEMPTY =10066;
const WSAEPROCLIM =10067;
const WSAEUSERS =10068;
const WSAEDQUOT =10069;
const WSAESTALE =10070;
const WSAEREMOTE =10071;
const WSASYSNOTREADY =10091;
const WSAVERNOTSUPPORTED =10092;
const WSANOTINITIALISED =10093;
const WSAEDISCON =10101;
const WSAENOMORE =10102;
const WSAECANCELLED =10103;
const WSAEINVALIDPROCTABLE =10104;
const WSAEINVALIDPROVIDER =10105;
const WSAEPROVIDERFAILEDINIT =10106;
const WSASYSCALLFAILURE =10107;
const WSASERVICE_NOT_FOUND =10108;
const WSATYPE_NOT_FOUND =10109;
const WSA_E_NO_MORE =10110;
const WSA_E_CANCELLED =10111;
const WSAEREFUSED =10112;
const WSAHOST_NOT_FOUND =11001;
const WSATRY_AGAIN =11002;
const WSANO_RECOVERY =11003;
const WSANO_DATA =11004;
const WSA_QOS_RECEIVERS =11005;
const WSA_QOS_SENDERS =11006;
const WSA_QOS_NO_SENDERS =11007;
const WSA_QOS_NO_RECEIVERS =11008;
const WSA_QOS_REQUEST_CONFIRMED =11009;
const WSA_QOS_ADMISSION_FAILURE =11010;
const WSA_QOS_POLICY_FAILURE =11011;
const WSA_QOS_BAD_STYLE =11012;
const WSA_QOS_BAD_OBJECT =11013;
const WSA_QOS_TRAFFIC_CTRL_ERROR=11014;
const WSA_QOS_GENERIC_ERROR =11015;
const WSA_QOS_ESERVICETYPE =11016;
const WSA_QOS_EFLOWSPEC =11017;
const WSA_QOS_EPROVSPECBUF =11018;
const WSA_QOS_EFILTERSTYLE =11019;
const WSA_QOS_EFILTERTYPE =11020;
const WSA_QOS_EFILTERCOUNT =11021;
const WSA_QOS_EOBJLENGTH =11022;
const WSA_QOS_EFLOWCOUNT =11023;
const WSA_QOS_EUNKOWNPSOBJ =11024;
const WSA_QOS_EPOLICYOBJ =11025;
const WSA_QOS_EFLOWDESC =11026;
const WSA_QOS_EPSFLOWSPEC =11027;
const WSA_QOS_EPSFILTERSPEC =11028;
const WSA_QOS_ESDMODEOBJ =11029;
const WSA_QOS_ESHAPERATEOBJ =11030;
const WSA_QOS_RESERVED_PETYPE =11031;

так что универс.решение - сотворить свой собственный "декодер"

Код, кажется, работает правильно в первый раз, но со второй попытки он попадает в функцию handle_connect и выводит "Error: A connect request was made on an already connected socket"

Вот как выглядит эта функция:

Я попытался скопировать этот раздел кода из инструкции else if statement в инструкцию else, думая, что он закроет сокет и повторно запустит функцию handle_connect, но она просто падает на программное обеспечение в строке endpoint= *endpoint_iterator.

Есть ли у кого-нибудь идеи, что мне делать в этой ситуации? Отсоединить розетку и снова подключиться? Если да, то как мне это сделать?

1 ответ

В последнее время я узнал о UDP сокете, просматривая сеть, и все страницы, которые объясняли это, упоминали, что UDP сокета-это connection less. Это, если я правильно понимаю, означает, что один из них не имеет connection между двумя сокетами, а вместо этого стреляет пакетами дейтаграмм в.

Возможно, использование опции SO_REUSEADDR с setsockopt может помочь.

Похожие вопросы:

Согласно man-страницам: Единственное различие между send() и write (2) заключается в наличии флагов. С аргументом нулевых флагов send() эквивалентно записи (2). Кроме того, следующий вызов send.

Я создаю плагин для своего сайта, который регистрирует мои клики по объявлениям. Один из способов, о котором я только что подумал, - это проверить, был ли сделан запрос на определенную страницу. Это.

В последнее время я узнал о UDP сокете, просматривая сеть, и все страницы, которые объясняли это, упоминали, что UDP сокета-это connection less. Это, если я правильно понимаю, означает, что один из.

Байсикли, что я хочу сделать, это выяснить, был ли запрос на мой сервис wcf сделан надежно. И я использую следующий код. context = OperationContext.Current; bool isSecure =.

Можно ли проверить JavaScript/ Jquery, в какое время последний запрос Ajax был сделан в коде JavaScript на стороне клиента?

Можно ли установить два соединения( или более) между ПК и другим устройством? Когда я пытаюсь это сделать, то получаю исключение: 10048 - > ex.Message = запрос на подключение был сделан на уже.

Учитывая следующий модульный тест, я могу легко проверить, был ли сделан запрос конкретного url. Есть ли способ сделать обратное, проверить, что запрос конкретного url был сделан NOT? т. е.

Разбей их по категориям (выбери касающиеся тебя) и через Case поймешь разорвано соединение или оно не установилось.

Добавлено 07.07.05, 12:19
А зачем тебе при неустановившемся соединении получать -1, а при разрыве выходить из программы. Не проще ли написать процедуру которая ожидает соединение и возобнавляет если оно разорвалось?



Добавлено 07.07.05, 20:17
Ну вобщем то я был прав

Len := FormatMessage(FORMAT_MESSAGE_FROM_HMODULE or FORMAT_MESSAGE_IGNORE_INSERTS or

В случае успеха функция WSAStartup возвращает нулевое значение. Если происходит ошибка, возвращается одно из следующих значений:
WSASYSNOTREADY Сетевое программное обеспечение не готово для работы
WSAVERNOTSUPPORTED Функция не поддерживается данной реализацией интерфейса Windows Sockets
WSAEINVAL Библиотека DLL, обеспечивающая интерфейсe Windows Sockets, не соответствуетверсии, указанной приложением указанной в параметре wVersionRequested

Если ошибка возникла при выполнении функции WSACleanup , функция WSAGetLastError может вернуть одно из следующих значений:Значение Описание
WSANOTINITIALISED Интерфейс Windows Sockets не был проинициализирован функцией WSAStartup
WSAENETDOWN Сбой сетевого программного обеспечения
WSAEINPROGRESS Во время вызыва функции WSACleanup выполнялась одна из блокирующих функций интерфейса Windows Sockets

В случае успеха функция socket возвращает дескриптор, который нужно использовать для выполнения всех операций над данным сокетом. Если же произошла ошибка, эта функция возвращает значение INVALID_SOCKET . Для анализа причины ошибки вы должны вызвать функцию WSAGetLastError , которая в данном случае может вернуть один из следующих кодов ошибки:
WSANOTINITIALISED Интерфейс Windows Sockets не был проинициализирован функцией WSAStartup
WSAENETDOWN Сбой сетевого программного обеспечения
WSAEAFNOSUPPORT Указан неправильный тип адреса
WSAEINPROGRESS Выполняется блокирующая функция интерфейса Windows Sockets
WSAEMFILE Израсходован весь запас свободных дескрипторов
WSAENOBUFS Нет памяти для создания буфера
WSAEPROTONOSUPPORT Указан неправильный протокол
WSAEPROTOTYPE Указанный протокол несовместим с данным типом сокета
WSAESOCKTNOSUPPORT Указанный тип сокета несовместим с данным типом адреса

Для освобождения ресурсов приложение должно закрывать сокеты, которые ему больше не нужны, вызывая функцию closesocket, коды ошибок для этой функции:
WSANOTINITIALISED Перед использованием функции closesocket необходимо вызвать функцию WSAStartup
WSAENETDOWN Сбой в сети
WSAENOTSOCK Указанный в параметре дескриптор не является сокетом
WSAEINPROGRESS Выполняется блокирующая функция интерфейса Windows Sockets
WSAEINTR Работа функции была отменена при помощи функции WSACancelBlockingCall

В случае ошибки функция bind возвращает значение SOCKET_ERROR . Дальнейший анализ причин ошибки следует выполнять при помощи функции WSAGetLastError . Возможные коды ошибок перечислены ниже:
WSANOTINITIALISED Перед использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWN Сбой в сети
WSAEADDRINUSE Указанный адрес уже используется
WSAEFAULT Значение параметра namelen меньше размера структуры sockaddr
WSAEINPROGRESS Выполняется блокирующая функция интерфейса Windows Sockets
WSAEAFNOSUPPORT Этот протокол не может работать с указанным семейством адресов
WSAEINVAL Сокет уже привязан к адресу
WSAENOBUFS Установлено слишком много соединений
WSAENOTSOCK Указанный в параметре дескриптор не является сокетом

Ниже мы привели список возможных кодов ошибок для функции listen:
WSANOTINITIALISED Перед использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWN Сбой в сети
WSAEADDRINUSE Указанный адрес уже используется
WSAEINPROGRESS Выполняется блокирующая функция интерфейса Windows Sockets
WSAEINVAL Сокет еще не был привязан к адресу или уже находится в подключенном состоянии
WSAEISCONN Сокет уже находится в подключенном состоянии
WSAEMFILE Недостаточно дескрипторов файлов
WSAENOBUFS Нет места для размещения буфера
WSAENOTSOCK Указанный в параметре дескриптор не является сокетом
WSAEOPNOTSUPP Функция listen не работает с сокетом указанного типа

Приведем список возможных кодов ошибок для функции accept:
WSANOTINITIALISED Перед использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWN Сбой в сети
WSAEFAULT Значение параметра addrlen меньше размера структуры адреса
WSAEINTR Работа функции была отменена при помощи функции WSACancelBlockingCall
WSAEINPROGRESS Выполняется блокирующая функция интерфейса Windows Sockets
WSAEINVAL Перед вызовом функции accept не была вызывана функция listen
WSAEMFILE Нет доступных дескрипторов
WSAENOBUFS Установлено слишком много соединений
WSAENOTSOCK Указанный в параметре дескриптор не является сокетом
WSAEOPNOTSUPP Данный тип сокета нельзя использовать при вызове функций, ориентированных на работу с каналом связи
WSAEWOULDBLOCK Сокет отмечен как неблокирующий и в настоящее время нет каналов связи, которые нужно устанавливать

Приведем список кодов ошибок, которые могут возникать при вызове команды send:
WSANOTINITIALISED Перед использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWN Сбой в сети
WSAEACCES Указанный адрес является широковещательным (broadcast), однако перед вызовом функции не был установлен соответствующий флаг
WSAEINTR Работа функции была отменена при помощи функции WSACancelBlockingCall
WSAEINPROGRESS Выполняется блокирующая функция интерфейса Windows Sockets
WSAEFAULT Параметр buf указан неправильно (он не указывает на адресное пространство, принадлежащее приложению)
WSAENETRESET Необходимо сбросить соединение
WSAENOBUFS Возникла блокировка буфера
WSAENOTCONN Сокет не подсоединен
WSAENOTSOCK Указанный в параметре дескриптор не является сокетом
WSAESHUTDOWN Сокет был закрыт функцией shutdown
WSAEWOULDBLOCK Сокет отмечен как неблокирующий, но запрошенная операция приведет к блокировке
WSAEMSGSIZE Был использован сокет типа SOCK_DGRAM (предназначенный для передачи датаграмм). При этом размер пакета данных превышает максимально допустимый для данной реализации интерфейса Windows Sockets
WSAEINVAL Сокет не был подключен функцией bind
WSAECONNABORTED Сбой из-за слишком большой задержки или по другой причине
WSAECONNRESET Сброс соединения удаленным узлом

При выполнении функции recv могут возникать следующие ошибки:
WSANOTINITIALISED Перед использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWN Сбой в сети
WSAENOTCONN Сокет не подсоединен
WSAEINTR Работа функции была отменена при помощи функции WSACancelBlockingCall
WSAEINPROGRESS Выполняется блокирующая функция интерфейса Windows Sockets
WSAENOTSOCK Указанный в параметре дескриптор не является сокетом
WSAESHUTDOWN Сокет был закрыт функцией shutdown
WSAEWOULDBLOCK Сокет отмечен как неблокирующий, но запрошенная операция приведет к блокировке
WSAEMSGSIZE Размер пакета данных превышает размер буфера, в результате чего принятый пакет был обрезан
WSAEINVAL Сокет не был подключен функцией bind
WSAECONNABORTED Сбой из-за слишком большой задержки или по другой причине
WSAECONNRESET Сброс соединения удаленным узлом

Если функция WSAAsyncSelect выполнилась успешно, она возвращает нулевое значение, при ошибке - значение SOCKET_ERROR. В зависимости от значения последнего параметра могут возникать разные коды ошибки, которые можно получить при помощи функции WSAGetLastError. Следующие ошибки могут возникнуть при любом значении параметра:
WSANOTINITIALISED Перед использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWN Сбой в сети
WSAEINVAL Сокет не был подключен функцией bind
WSAEINPROGRESS Выполняется блокирующая функция интерфейса Windows Sockets

Дополнительный код ошибки можно получить из параметра lParam при помощи макрокоманды WSAGETSELECTERROR.
При использовании параметра FD_CONNECT возможно появление следующих ошибок:
WSAEADDRINUSE Указанный адрес уже используется
WSAEADDRNOTAVAIL Указанный адрес не доступен
WSAEAFNOSUPPORT Для данного сокета нельзя использовать указанное семейство адресов
WSAECONNREFUSED Попытка установления канала связи была отвергнута
WSAEDESTADDRREQ Необходимо указать адрес получателя пакета
WSAEFAULT Неправильно указан параметр namelen
WSAEINVAL Сокет уже подключен к адресу
WSAEISCONN Сокет уже подсоединен
WSAEMFILE Больше нет доступных дескрипторов
WSAENETUNREACH Из данного узла и в данное время невозможно получить доступ к сети
WSAENOBUFS Нет места для размещения буфера
WSAENOTCONN Сокет на подключен
WSAENOTSOCK Указан дескриптор файла, а не сокета
WSAETIMEDOUT При попытке установления канала связи возникла задержка во времени

Если используется параметр FD_CLOSE, может возникнуть одна из следующих ошибок:
WSAENETDOWN Сбой в сети
WSAECONNRESET Сброс соединения удаленным узлом
WSAECONNABORTED Сбой из-за слишком большой задержки или по другой причине

Ниже мы привели возможные коды ошибок для функции recv from:
WSANOTINITIALISED Перед использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWN Сбой в сети
WSAEFAULT Слишком малое значение параметра, определяющего размер буфера для приема данных
WSAEINTR Работа функции была отменена при помощи функции WSACancelBlockingCall
WSAEINPROGRESS Выполняется блокирующая функция интерфейса Windows Sockets
WSAEINVAL Сокет не был подключен функцией bind
WSAENOTSOCK Указанный дескриптор не является дескриптором сокета
WSAESHUTDOWN Сокет был закрыт функцией shutdown
WSAEWOULDBLOCK Сокет отмечен как неблокирующий, но запрошенная операция приведет к блокировке
WSAEMSGSIZE Размер датаграммы слишком большой, поэтому соответствующий блок данных не помещается в буфер. Принятый блок данных был обрезан
WSAECONNABORTED Сбой из-за слишком большой задержки или по другой причине
WSAECONNRESET Сброс соединения удаленным узлом


---
По материалам © Александр Фролов, Григорий Фролов
Том 23, М.: Диалог-МИФИ, 1993, 283 стр.

Описание кодов ошибок во время закачки

Описание ошибки

Операция блокирования прервана вызовом WSACancelBlockingCall.10009 Предоставленный дескриптор файла неверен.

Сделана попытка доступа к сокету методом, запрещенным правами доступа.

Система обнаружила недопустимый указатель адреса при попытке использовать в вызове аргумент указателя.

Получен недопустимый аргумент.

Открыто слишком много сокетов.

Операция на незаблокированном сокете не может быть завершена немедленно.

Сейчас выполняется операция блокировки.

На незаблокированном сокете сделана попытка выполнить операцию при наличии другой выполняемой операции.

Сделана попытка выполнить операцию на объекте, не являющемся сокетом.

В операции на сокете пропущен обязательный адрес.

Протокол, указанный в вызове функции сокета, не поддерживает такую семантику для требуемого типа сокета.

Для вызова getsockopt или setsockopt был указан неизвестный, недопустимый или неподдерживаемый параметр или уровень.

Требуемый протокол не настроен в данной системе, или не существует его реализации.

Поддержка указанного типа сокетов в этом семействе адресов отсутствует.

Предпринятая операция не поддерживается для выбранного типа объекта.

Данное семейство протоколов не настроено в системе, или оно не реализовано.

Адрес несовместим с выбранным протоколом.

Обычно разрешается одно использование адреса сокета (протокол/сетевой адрес/порт).

Требуемый адрес для своего контекста неверен.
Возможные способы устранения проблемы

Операция на сокете обнаружила отключение сети.

Сделана попытка выполнить операцию на сокете при отключенной сети.

Подключение было разорвано из-за ошибки во время выполнения операции.

Программа на вашем хост-компьютере разорвала установленное подключение.

Удаленный хост принудительно разорвал существующее подключение.

Невозможно выполнить операцию на сокете, т.к. буфер слишком мал или очередь переполнена.

Сделан запрос на подключение для уже подключенного сокета.

Запрос на отправку или получение данных (when sending on a datagram socket using a sendto call) no address was supplied.
Возможные способы устранения проблемы

Запрос на отправку или получение данных был запрещен, т.к. сокет уже отключен в данном направлении на основании прежней запроса на его отключение.

Слишком много ссылок на некоторый ключевой объект.

Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера.
Возможные способы устранения проблемы

Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение.

Не удается преобразовать имя.

Компонент имени или все имя слишком длинно.

Произошла ошибка операции на сокете, т.к. конечный хост выключен.

Сделана попытка выполнить операцию на сокете для недоступного хоста.

Нельзя удалить пустой каталог.

Реализация Windows Sockets может иметь ограничения на количество одновременно выполняющихся приложений.

Дисковая квота исчерпана.

Ссылка дескриптора файла более недоступна.

Элемент локально недоступен.

WSAStartup не может выполняться в данное время, т.к. недоступна основная система, используемая для работы сетевых служб .

Указанная версия Windows Sockets не поддерживается.

Или приложение не вызвало WSAStartup, или произошла ошибка в WSAStartup.

Возвращено WSARecv или WSARecvFrom, чтобы показать - удаленная сторона инициировала правильную последовательность отключения.

WSALookupServiceNext не может возвратить каких-либо дополнительных результатов.

Был сделан вызов WSALookupServiceEnd, когда этот вызов еще обрабатывался. Обрабатываемый вызов был прерван.

Недопустимая таблица вызова процедуры.

Недопустимый поставщик услуг.

Не удается загрузить или инициализировать нужного поставщика услуг.

Произошла ошибка системного вызова, что недопустимо.

Неизвестная служба. Эта служба отсутствует в указанном пространстве имен.

Указанный класс не найден.

WSALookupServiceNext не может возвратить каких-либо дополнительных результатов.

Был сделан вызов WSALookupServiceEnd, когда этот вызов еще обрабатывался. Обрабатываемый вызов был прерван.

Произошла ошибка запроса к базе данных, т.к. запрос был активно отвергнут.

Этот хост неизвестен.

Возможно, отсутствует связь, или не указан прокси сервер.

Обычно - это временная ошибка, возникающая во время разрешения имени узла, и означающая, что локальный сервер не получил ответа от заслуживающего доверие сервера.

При просмотре базы данных произошла неисправимая ошибка.

Затребованное имя допустимо и оно найдено в базе данных, но для имени отсутствуют связанные с ним данные, которые были разрешены для него.

Читайте также: