powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Переподключение сокетов
16 сообщений из 16, страница 1 из 1
Переподключение сокетов
    #40086917
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спрошу я здесь. Есть у меня TCP сокет
Код: pascal
1.
s := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);


1. Будет ли корректным такой код
Код: pascal
1.
while connect(s, addr, SizeOf(addr)) = SOCKET_ERROR do;

или я после неудачной попытки соединения должен вызывать closesocket() и повторно socket()?

2. Если после успешного соединения сокет закрылся, могу ли я на том же сокете опять вызвать connect? Или опять нужно вызывать пару closesocket()/socket()?

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Переподключение сокетов
    #40086918
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
1. Будет ли корректным такой код
Этот вопрос снят
If the error code returned indicates the connection attempt failed (that is, WSAECONNREFUSED, WSAENETUNREACH, WSAETIMEDOUT) the application can call connect again for the same socket.
...
Рейтинг: 0 / 0
Переподключение сокетов
    #40086921
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_> после неудачной попытки соединения должен вызывать closesocket()

Нет, не должен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Переподключение сокетов
    #40086964
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
2. Если после успешного соединения сокет закрылся, могу ли я на том же сокете опять вызвать connect? Или опять нужно вызывать пару closesocket()/socket()?
Что значит закрылся? Ошибка какая-то похожая пришла?
Сервер мог вызвать shutdown, и ОС могла пометить это для твоего хэндла.
То же самое - если со стороны клиента закрывают сокет (отправляя shutdown перед closecocket, что тоже обязательно).
В общем у меня практика такая - после любой ошибки пересоздавать сокет, если требуется переподключение со стороны клиента.
...
Рейтинг: 0 / 0
Переподключение сокетов
    #40086972
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
реконнект без паузы само по себе моветон
нужна задержка, неплохо если экспоненциальная
...
Рейтинг: 0 / 0
Переподключение сокетов
    #40087007
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Код: pascal
1.
while connect(s, addr, SizeOf(addr)) = SOCKET_ERROR do;


"Я нажал Подключиться и всё повисло!"
...
Рейтинг: 0 / 0
Переподключение сокетов
    #40087014
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгений
реконнект без паузы само по себе моветон
Это всего лишь иллюстрация идеи
YuRock
Ошибка какая-то похожая пришла?
Да. Например WSAECONNREFUSED
YuRock
Сервер мог вызвать shutdown,
И пускай. Он же это делает для своего сокета. Какое отношение серверный сокет имеет к клиентскому?
YuRock
отправляя shutdown перед closecocket, что тоже обязательно
Это где написано про обязательность?
...
Рейтинг: 0 / 0
Переподключение сокетов
    #40087016
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Это где написано про обязательность?

https://docs.microsoft.com/en-us/windows/win32/winsock/graceful-shutdown-linger-options-and-socket-closure-2
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Переподключение сокетов
    #40087027
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Переподключение сокетов
    #40087039
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо. Буду иметь в виду.

Но все таки, после вызова shutdown, closesocket или обрыва кабеля на сервере, может ли клиент использовать тот же сокет для вызова connect?
...
Рейтинг: 0 / 0
Переподключение сокетов
    #40087047
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
YuRockСервер мог вызвать shutdown,
И пускай. Он же это делает для своего сокета. Какое отношение серверный сокет имеет к клиентскому?Этот сигнал (shutdown) не зря идёт через все шлюзы и доходит до клиента.
...
Рейтинг: 0 / 0
Переподключение сокетов
    #40087048
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Но все таки, после вызова shutdown, closesocket или обрыва кабеля на сервере, может ли клиент использовать тот же сокет для вызова connect?
Подозреваю, что на разных операционках (вплоть до разных версий) поведение может быть разным.
А что, проблема на всякий случай выделить новый хэндл? Не такая уж частая это операция - реконнект.
...
Рейтинг: 0 / 0
Переподключение сокетов
    #40087052
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-connect
When a connection between sockets is broken, the socket that was connected should be
discarded and new socket should be created. When a problem develops on a connected socket,
the application must discard the socket and create the socket again in order to return to
a stable point.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Переподключение сокетов
    #40087063
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Спасибо. Т.е. до успешного коннекта можно вызывать connect сколько угодно раз, а после только с пересозданием
...
Рейтинг: 0 / 0
Переподключение сокетов
    #40087078
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Dimitry Sibiryakov,

Спасибо. Т.е. до успешного коннекта можно вызывать connect сколько угодно раз, а после только с пересозданием
В цитате, которую привел Dimitry Sibiryakov, использовано слово broken. Наверное это означает, что произошло что-то аварийное. А если вызвали shutdown, то вот:
авторOnce the shutdown function is called to disable send, receive, or both, there is no method to re-enable send or receive for the existing socket connection.

An application should not rely on being able to reuse a socket after it has been shut down. In particular, a Windows Sockets provider is not required to support the use of connect on a socket that has been shut down.

If an application wants to reuse a socket, then the DisconnectEx function should be called with the dwFlags parameter set to TF_REUSE_SOCKET to close a connection on a socket and prepare the socket handle to be reused. When the DisconnectEx request completes, the socket handle can be passed to the AcceptEx or ConnectEx function.
https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-shutdown
То есть, пишут, что после вызова shutdown полагаться на то,что можно снова вызвать connect, не стоит. (То есть тоже стоит закрыть сокет и, если надо, создать новый). И пишут, что чтобы использовать сокет повторно, надо вызывать функцию DisconnectEx.
...
Рейтинг: 0 / 0
Переподключение сокетов
    #40087092
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В итоге это опять-таки сводится к графу состояний сокета. Только в моей цитате сказано,
что способа привести сокет в нужное состояние нет, а в твоей он таки есть.

PS: По-любому повторное использование туалетной бумаги - плохая идея.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Переподключение сокетов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]