powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сокеты Беркли -реконнект.
24 сообщений из 24, страница 1 из 1
Сокеты Беркли -реконнект.
    #39414918
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для связи между программами используются сокеты - Класс Socket .
Сервер
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
private IPHostEntry ipHost;
private IPAddress ipAddr;
private IPEndPoint ipEndPoint;
private Socket sListener;
private Socket handler;
ipHost = Dns.GetHostEntry("localhost");
ipAddr = ipHost.AddressList[0];
ipEndPoint = new IPEndPoint(ipAddr, port);
sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.IP);
sListener.Bind(ipEndPoint);
sListener.Listen(10);
handler = sListener.Accept();
handler.ReceiveTimeout=10000;
handler.SendTimeout = 10000;

Далее -прием/передача
Клиент
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
bytes = gcnew cli::array<Byte, 1>(1024);
ipHost = Dns::GetHostEntry("localhost");
ipAddr = ipHost->AddressList[0];
ipEndPoint = gcnew IPEndPoint(ipAddr, port);
Tw = tw;
sender = gcnew Socket(ipAddr->AddressFamily, SocketType::Stream, ProtocolType::IP);
sender->ReceiveTimeout = Tw;
sender->SendTimeout = Tw;
sender->Connect(ipEndPoint);

Далее,аналогично, прием/передача.
И в клинте и в сервере прием/передача обвешаны try... catch.
Клиент и сервер оформлены как классы. Здесь код объединен в порядке выполнения. Весь код рабочий, здесь вопросов нет.
По условию задачи, связь клиент-сервер может иногда обрываться. вопрос в том, как обеспечить восстановление связи без полной перезагрузки сервера и клиента? К сожалению, в MSDN этот процесс не определен.
Сейчас для восстановления связи работаю с соответствующими handler на стороне сервера и клиента. Связь возобновляется, но результат непредсказуем - то возобновляется, то нет. Пробовал разные варианты - устойчивости повторного коннекта достичь не удалось.

"Есть многое на свете, друг Горацио, что и не сразу в голову придет."
М. Твен "Приключения Геккельбери Финна"
...
Рейтинг: 0 / 0
Сокеты Беркли -реконнект.
    #39414973
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YUBAИ в клинте и в сервере прием/передача обвешаны try... catch.


Я не большой специалист в микромягком программировании ,
но по логике, при проблемах чтения(записи) из(в) сокет
программа вывалиться в соотвествующий потере соединения блок catch .
...
Рейтинг: 0 / 0
Сокеты Беркли -реконнект.
    #39414986
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
д0kХЯ не большой специалист в микромягком программировании ,
но по логике, при проблемах чтения(записи) из(в) сокет программа вывалиться в соотвествующий потере соединения блок catch .Да, для этого они и задуманы, чтобы из try... catch уйти в инициализацию нового соединения и блокировать прием/передачу до коннекта.
...
Рейтинг: 0 / 0
Сокеты Беркли -реконнект.
    #39414989
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YUBAд0kХЯ не большой специалист в микромягком программировании ,
но по логике, при проблемах чтения(записи) из(в) сокет программа вывалиться в соотвествующий потере соединения блок catch .Да, для этого они и задуманы, чтобы из try... catch уйти в инициализацию нового соединения и блокировать прием/передачу до коннекта.

Вы сами ответили на свой вопрос.

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


И никто вам тут не поможет, пока вы не покажете как выглядит ваш блок try... catch.
...
Рейтинг: 0 / 0
Сокеты Беркли -реконнект.
    #39414992
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBAд0kХЯ не большой специалист в микромягком программировании ,
но по логике, при проблемах чтения(записи) из(в) сокет программа вывалиться в соотвествующий потере соединения блок catch .Да, для этого они и задуманы, чтобы из try... catch уйти в инициализацию нового соединения и блокировать прием/передачу до коннекта.

То есть у тебя код в духе:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
while (true) {
try {
   sListener.Listen(10);
   handler = sListener.Accept();
   ....
} catch {SomeException e) {}
}


Код: plaintext
1.
2.
3.
4.
5.
6.
while (true) {
try {
   sender->Connect(ipEndPoint);
   ....
} catch {SomeException e) {}
}


Да?
...
Рейтинг: 0 / 0
Сокеты Беркли -реконнект.
    #39414997
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlYUBAпропущено...
Да, для этого они и задуманы, чтобы из try... catch уйти в инициализацию нового соединения и блокировать прием/передачу до коннекта.

То есть у тебя код в духе:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
while (true) {
try {
   sListener.Listen(10);
   handler = sListener.Accept();
   ....
} catch {SomeException e) {}
}


Код: plaintext
1.
2.
3.
4.
5.
6.
while (true) {
try {
   sender->Connect(ipEndPoint);
   ....
} catch {SomeException e) {}
}


Да?

Нет
У вас на операциях чтения-записи сокета должно быть:
Код: plaintext
1.
 catch {SomeException e) { // тут }


вы должны узнать, что произошло
и при неоходимости переустановить соедениние.
...
Рейтинг: 0 / 0
Сокеты Беркли -реконнект.
    #39414999
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
д0kХWhite Owlпропущено...


То есть у тебя код в духе:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
while (true) {
try {
   sListener.Listen(10);
   handler = sListener.Accept();
   ....
} catch {SomeException e) {}
}


Код: plaintext
1.
2.
3.
4.
5.
6.
while (true) {
try {
   sender->Connect(ipEndPoint);
   ....
} catch {SomeException e) {}
}


Да?

Нет
У вас на операциях чтения-записи сокета должно быть:
Код: plaintext
1.
 catch {SomeException e) { // тут }


вы должны узнать, что произошло
и при неоходимости переустановить соедениние.

извини , я перепутал тебя с ТС.
...
Рейтинг: 0 / 0
Сокеты Беркли -реконнект.
    #39415010
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
д0kХИ никто вам тут не поможет, пока вы не покажете как выглядит ваш блок try... catch.Вопрос темы не в try... catch, а в принципах повторной корректной инициализации сокетов клиента и сервера.
Например, сервер. Листенер рассчитан на очередь в 10 соединений. С ним делать ничего не надо. В начальном случае при наличии клиента он вызывает следующий за ним Accept, принимающий соединение. При повторном коннекте листенер, оч. похоже, ничего не вызывает, и остается лупить этим Accept до полного одержания, что неправильно. Иногда это срабатывает, иногда нет.
Так что, вопрос не программный, а идеологический - как правильно с этой конструкцией работать при повторном коннекте.
Кстати, в WinSock конструкции примерно идентичны, и при ошибках вываливается, в конечном итоге в хидеры WinSock.
...
Рейтинг: 0 / 0
Сокеты Беркли -реконнект.
    #39415013
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
То есть у тебя код в духе:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
while (true) {
try {
   sListener.Listen(10);
   handler = sListener.Accept();
   ....
} catch {SomeException e) {}
}


Код: plaintext
1.
2.
3.
4.
5.
6.
while (true) {
try {
   sender->Connect(ipEndPoint);
   ....
} catch {SomeException e) {}
}


Да?Безусловно, только sListener.Listen(10); - имхо, здесь не надо. Листенер и так очередь на 10 претендентов на соединение.
А вот проверить листенер на наличие очереди не мешает, перед вызовом Accept. Буду искать.
...
Рейтинг: 0 / 0
Сокеты Беркли -реконнект.
    #39415016
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YUBAд0kХИ никто вам тут не поможет, пока вы не покажете как выглядит ваш блок try... catch.Вопрос темы не в try... catch, а в принципах повторной корректной инициализации сокетов клиента и сервера.
Например, сервер. Листенер рассчитан на очередь в 10 соединений. С ним делать ничего не надо. В начальном случае при наличии клиента он вызывает следующий за ним Accept, принимающий соединение. При повторном коннекте листенер, оч. похоже, ничего не вызывает, и остается лупить этим Accept до полного одержания, что неправильно. Иногда это срабатывает, иногда нет.
Так что, вопрос не программный, а идеологический - как правильно с этой конструкцией работать при повторном коннекте.
Кстати, в WinSock конструкции примерно идентичны, и при ошибках вываливается, в конечном итоге в хидеры WinSock.

Я уже сам запутался в ваших мыслях и словах.

где у вас

YUBAДалее -прием/передача


Для понимания происходящего в сокетах
приблизительно , сюда ищите аналог для вашего сетевого класса
...
Рейтинг: 0 / 0
Сокеты Беркли -реконнект.
    #39415017
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предупреждаю: код не смотрел.

В общем случае решение простое:
1. В начале прописать алгоритм установки соединения, т.е. случаи неудачных попыток и повторные попытки повтора.
2. В случае обрыва все почистить и в п.1
...
Рейтинг: 0 / 0
Сокеты Беркли -реконнект.
    #39415020
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TПредупреждаю: код не смотрел.

В общем случае решение простое:
1. В начале прописать алгоритм установки соединения, т.е. случаи неудачных попыток и повторные попытки повтора.
2. В случае обрыва все почистить и в п.1


У коллеги есть

try... catch.

В catch должны обрабатываться разрывы , и при необходимости
перустанавливаться соединения , что бы
следующий в цикле try переотправил то, что обрвалось по ошибке
в том числе и ошибке записи в сокет.
...
Рейтинг: 0 / 0
Сокеты Беркли -реконнект.
    #39415040
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
д0kХDima TПредупреждаю: код не смотрел.

В общем случае решение простое:
1. В начале прописать алгоритм установки соединения, т.е. случаи неудачных попыток и повторные попытки повтора.
2. В случае обрыва все почистить и в п.1


У коллеги есть

try... catch.

В catch должны обрабатываться разрывы , и при необходимости
перустанавливаться соединения , что бы
следующий в цикле try переотправил то, что обрвалось по ошибке
в том числе и ошибке записи в сокет.
И зря. Ненужное усложнение. На каком месте оборвалось? Непонятно. 100500 вариантов, все не обработать. Тупо почистить и на старт.
...
Рейтинг: 0 / 0
Сокеты Беркли -реконнект.
    #39415055
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИ зря. Ненужное усложнение. На каком месте оборвалось? Непонятно. 100500 вариантов, все не обработать. Тупо почистить и на старт.Ну, все и не надо обрабатывать, только разрывы.
Зачем все и тупо чистить? В сервере листенер уже работает. Остается почистить следы Accept и вызвать его заново. Вроде.
ЗЫ По MSDN оказалось, что узнать состояние листенера нереально.(
...
Рейтинг: 0 / 0
Сокеты Беркли -реконнект.
    #39415062
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBAсервер. Листенер рассчитан на очередь в 10 соединений. С ним делать ничего не надо. В начальном случае при наличии клиента он вызывает следующий за ним Accept, принимающий соединение. При повторном коннекте листенер, оч. похоже, ничего не вызывает, и остается лупить этим Accept до полного одержания, что неправильно. Иногда это срабатывает, иногда нет.

бред какой-то. Нет никаких проблем с листенером и accept
...
Рейтинг: 0 / 0
Сокеты Беркли -реконнект.
    #39415063
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилбред какой-то. Нет никаких проблем с листенером и acceptВаши предложения?
По MSDN получается, что остается только долбить Accept в try...catch.
...
Рейтинг: 0 / 0
Сокеты Беркли -реконнект.
    #39415071
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBAВаши предложения?
1)выбросить на помойку Managed c++
2)спокойно запрограммировать сокеты в соответсвии с документацией без всяких exceptions
...
Рейтинг: 0 / 0
Сокеты Беркли -реконнект.
    #39415078
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил1)выбросить на помойку Managed c++
Вместе с .net классами. Обычные функции BSD-сокетов гораздо проще в применении и понимании.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сокеты Беркли -реконнект.
    #39415084
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил1)выбросить на помойку Managed c++
2)спокойно запрограммировать сокеты в соответсвии с документацией без всяких exceptions1. не могу
2. Так и делаю. К сожалению, не все в документации однозначно прописано.

Будем считать, что с сервером разобрались, и никаких изменений вносить не надо. Да, не сказал, что Accept вызывается в блокирующем режиме, и, на деле, его бесконечный вызов может случиться только при возникновении исключений.
Теперь 2-й вопрос - автоматом переподключить клиент.
Повторю код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
bytes = gcnew cli::array<Byte, 1>(1024);
ipHost = Dns::GetHostEntry("localhost");
ipAddr = ipHost->AddressList[0];
ipEndPoint = gcnew IPEndPoint(ipAddr, port);
Tw = tw;
sender = gcnew Socket(ipAddr->AddressFamily, SocketType::Stream, ProtocolType::IP);
sender->ReceiveTimeout = Tw;
sender->SendTimeout = Tw;
sender->Connect(ipEndPoint);

Здесь вообще, полагаю не может быть ничего неправильного. - удаляем отработавший sender (в соответствии с MSDN) и далее последние 4 строчки. Не исключено, что хватило бы и одного sender->Connect(ipEndPoint), не знаю.
Видимо причины неоднозначного повторного коннекта не в некорректном применении сокетов. И то хорошо.
...
Рейтинг: 0 / 0
Сокеты Беркли -реконнект.
    #39415092
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,

Dispose этому говнищу не забываешь сделать?
...
Рейтинг: 0 / 0
Сокеты Беркли -реконнект.
    #39415104
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилYUBA,

Dispose этому говнищу не забываешь сделать?Не забываю. Кое где на Dispose при компиляции ругается и просит вызвать деструктор sender->~Socket(); VS видней.))
...
Рейтинг: 0 / 0
Сокеты Беркли -реконнект.
    #39415760
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
д0kХDima TПредупреждаю: код не смотрел.

В общем случае решение простое:
1. В начале прописать алгоритм установки соединения, т.е. случаи неудачных попыток и повторные попытки повтора.
2. В случае обрыва все почистить и в п.1


У коллеги есть

try... catch.

В catch должны обрабатываться разрывы , и при необходимости
перустанавливаться соединения , что бы
следующий в цикле try переотправил то, что обрвалось по ошибке
в том числе и ошибке записи в сокет.

Не факт, смотря как он там все написал...
...
Рейтинг: 0 / 0
Сокеты Беркли -реконнект.
    #39415902
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,
как обеспечить восстановление связи без полной перезагрузки сервера и клиента
а как это сделать с полной перезагрузкой сервера и клиента уже известно ?7
...
Рейтинг: 0 / 0
Сокеты Беркли -реконнект.
    #39415908
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeMYUBA,
как обеспечить восстановление связи без полной перезагрузки сервера и клиента
а как это сделать с полной перезагрузкой сервера и клиента уже известно ?7Безусловно. Код в начале темы.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сокеты Беркли -реконнект.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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