Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Переподключение сокетов / 16 сообщений из 16, страница 1 из 1
28.07.2021, 21:20
    #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
28.07.2021, 21:25
    #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
28.07.2021, 21:37
    #40086921
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переподключение сокетов
_Vasilisk_> после неудачной попытки соединения должен вызывать closesocket()

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


"Я нажал Подключиться и всё повисло!"
...
Рейтинг: 0 / 0
29.07.2021, 12:39
    #40087014
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переподключение сокетов
Дегтярев Евгений
реконнект без паузы само по себе моветон
Это всего лишь иллюстрация идеи
YuRock
Ошибка какая-то похожая пришла?
Да. Например WSAECONNREFUSED
YuRock
Сервер мог вызвать shutdown,
И пускай. Он же это делает для своего сокета. Какое отношение серверный сокет имеет к клиентскому?
YuRock
отправляя shutdown перед closecocket, что тоже обязательно
Это где написано про обязательность?
...
Рейтинг: 0 / 0
29.07.2021, 12:49
    #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
29.07.2021, 13:31
    #40087027
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переподключение сокетов
...
Рейтинг: 0 / 0
29.07.2021, 14:05
    #40087039
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переподключение сокетов
Хорошо. Буду иметь в виду.

Но все таки, после вызова shutdown, closesocket или обрыва кабеля на сервере, может ли клиент использовать тот же сокет для вызова connect?
...
Рейтинг: 0 / 0
29.07.2021, 14:20
    #40087047
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переподключение сокетов
_Vasilisk_
YuRockСервер мог вызвать shutdown,
И пускай. Он же это делает для своего сокета. Какое отношение серверный сокет имеет к клиентскому?Этот сигнал (shutdown) не зря идёт через все шлюзы и доходит до клиента.
...
Рейтинг: 0 / 0
29.07.2021, 14:24
    #40087048
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переподключение сокетов
_Vasilisk_
Но все таки, после вызова shutdown, closesocket или обрыва кабеля на сервере, может ли клиент использовать тот же сокет для вызова connect?
Подозреваю, что на разных операционках (вплоть до разных версий) поведение может быть разным.
А что, проблема на всякий случай выделить новый хэндл? Не такая уж частая это операция - реконнект.
...
Рейтинг: 0 / 0
29.07.2021, 14:31
    #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
29.07.2021, 14:55
    #40087063
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переподключение сокетов
Dimitry Sibiryakov,

Спасибо. Т.е. до успешного коннекта можно вызывать connect сколько угодно раз, а после только с пересозданием
...
Рейтинг: 0 / 0
29.07.2021, 15:31
    #40087078
s62
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
29.07.2021, 15:43
    #40087092
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переподключение сокетов
В итоге это опять-таки сводится к графу состояний сокета. Только в моей цитате сказано,
что способа привести сокет в нужное состояние нет, а в твоей он таки есть.

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


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