Socket with MFC
От: SergeyRo  
Дата: 16.04.01 12:20
Оценка:
Для осуществления всего нижеописанного я использую класс CAsyncSocket(MFC).
OS: Winnt 4.0 SP6
Среда разработки: Visual C++ 6.0 SP4

Есть программы запущенные на разных компьютерах, одно является сервером другое клиентом.
Программа клиент посылает данные программе сервер.
Создается клиентский сокет, далее он соединяется с сервером на другом компьютере
и когда вызывается функция OnConnect посылаются данные серверу,
после того как вызывается функция OnSend сокет закрывается и удаляется.
На сервере есть слушающий сокет, который получив запрос на соединение создает новый сокет
и передает ему управление посредством вызова функции Accept, далее этот новый сокет получает
данные закрывается и удаляется. Запросов на передачу данных в программе клиенте
много и есть подозрения что данные либо теряются, либо долго передаются, а это актуально т.к. система является realtime.
Возможно нужно использовать один сокет, а не плодить их при каждой передаче, но тогда необходимо оперативно
отслеживать разрыв соединения порядка 1-2 сек, а как это сделать и хватит ли пропускной способности если
предположить что за одну секунду должно передаться 300-400 запросов каждый в среднем по 50-70 байт ???
Попутно я обнаружил следующее:
Если соединение произошло нормально и затем я отключаю компьютер от локальной сети и вызываю
функцию Send, то функция OnSend вызывается с кодом ошибки 0 (нет ошибок),
но как такое может быть, данные ведь не передались !!! И как сделать так, чтобы OnSend вызывалась только
после того как данные действительно были переданы или когда истек таймаут на их передачу !!!

Сергей
Re: Socket with MFC
От: av Россия  
Дата: 17.04.01 21:36
Оценка:
Ну... Вообще-то, если пропускная способность сетки невелика, то ты ничего не сделаешь, и
тонкости рализации протокола здесь ни при чем. Один сокет имхо использовать не надо:
на серверах, если я не ошибаюсь, сокеты плодятся accept'ом и прекрасно себя чувствуют.
Тут я могу посоветовать только использовать UDP (он побыстрее), а уже поверх него писать
свой собственный протокол соединения.

Да, если все-таки победишь, напиши, плиз, как с этим справился. Я и сам когда-то писал
нечто подобное, и именно из-за этого бросил.

AV
Re: Socket with MFC
От: QZ  
Дата: 18.04.01 06:34
Оценка:
Здравствуйте SergeyRo, 16.04.2001 06:20:30 вы писали:

>Попутно я обнаружил следующее:

>Если соединение произошло нормально и затем я отключаю компьютер от локальной сети и вызываю
>функцию Send, то функция OnSend вызывается с кодом ошибки 0 (нет ошибок),
>но как такое может быть, данные ведь не передались !!! И как сделать так, чтобы OnSend вызывалась только
>после того как данные действительно были переданы или когда истек таймаут на их передачу !!!

Дело в реализации — когда данные переданы ядру для передачи,
Winsock считает, что они уже переданы. Такая же беда творится,
например, и на Solaris — обходить можно следующим образом —
выставлять на сокете LINGER и по закрытии сокета проверять, за какое время он был закрыт,
если это время равно LINGER timeout — считать, что данные не
переданы
Re: Socket with MFC
От: Eugene  
Дата: 19.04.01 16:50
Оценка:
Здравствуйте, Сергей.

При нормальной работе аппаратуры данные при потоковой передаче теряться не должны. А что такое "долго передаются"? Строго говоря, сеть Ethernet по определению не обеспечивает гарантрованного времени доставки, а такой режим (300-400 пакетов в секунду) дает приличную нагрузку. На мой взгляд, в этой ситуации следует использовать постоянное соединение (не разрывать его каждый раз) и квитировать со стороны сервера каждый пакет коротким уведомлением. Тогда можно будет по отсутствию квитанции быстро определить нештатные ситуации типа "порыв кабеля", сбои питания сетевой аппаратуры и т.п. Думаю, 1-2 сек это вполне реальное время ограничения таймаута ожидания квитанции. Кроме этого,такой способ позволяет синхронизировать производительность передающей и принимающей сторон и сетевой аппаратуры. Хотя непонятно,что делает Ваш клиент с данными после определения факта разыва (или просто если сервер не успевает читать данные от клиентов в нужном темпе), но это уже другая проблема:).

С уважением,
Евгений Шмелев.
Don't trouble trouble until trouble troubles you
Re: Socket with MFC
От: Mikrozaur  
Дата: 24.04.01 09:15
Оценка:
Здравствуйте SergeyRo, 16.04.2001 06:20:30 вы писали:

Ну я в данном случае посоветовал бы обратится к опыту ftp т.е.
сервер слушает один порт постоянно клиент коннектится к этому сокету собщает некоторую
информацию о себе затем обрывает соединение и доднимает у себя на прослушку 2 сокета
сервер лепится к клиенту по обоим сокетам причем один использует исключительно для приема а второй для квотации т.е
каждые N пакетов он сообщает клиенту что пакеты NN такието ок...
а клиент проверяет за какой пакт пакетов была последняя квотация и как давно
ну а дальше обрабатывает ошибки...
Или я не так понял задачу ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.