Для осуществления всего нижеописанного я использую класс 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 вызывалась только
после того как данные действительно были переданы или когда истек таймаут на их передачу !!!
Ну... Вообще-то, если пропускная способность сетки невелика, то ты ничего не сделаешь, и
тонкости рализации протокола здесь ни при чем. Один сокет имхо использовать не надо:
на серверах, если я не ошибаюсь, сокеты плодятся accept'ом и прекрасно себя чувствуют.
Тут я могу посоветовать только использовать UDP (он побыстрее), а уже поверх него писать
свой собственный протокол соединения.
Да, если все-таки победишь, напиши, плиз, как с этим справился. Я и сам когда-то писал
нечто подобное, и именно из-за этого бросил.
Здравствуйте SergeyRo, 16.04.2001 06:20:30 вы писали:
>Попутно я обнаружил следующее: >Если соединение произошло нормально и затем я отключаю компьютер от локальной сети и вызываю >функцию Send, то функция OnSend вызывается с кодом ошибки 0 (нет ошибок), >но как такое может быть, данные ведь не передались !!! И как сделать так, чтобы OnSend вызывалась только >после того как данные действительно были переданы или когда истек таймаут на их передачу !!!
Дело в реализации — когда данные переданы ядру для передачи,
Winsock считает, что они уже переданы. Такая же беда творится,
например, и на Solaris — обходить можно следующим образом —
выставлять на сокете LINGER и по закрытии сокета проверять, за какое время он был закрыт,
если это время равно LINGER timeout — считать, что данные не
переданы
При нормальной работе аппаратуры данные при потоковой передаче теряться не должны. А что такое "долго передаются"? Строго говоря, сеть Ethernet по определению не обеспечивает гарантрованного времени доставки, а такой режим (300-400 пакетов в секунду) дает приличную нагрузку. На мой взгляд, в этой ситуации следует использовать постоянное соединение (не разрывать его каждый раз) и квитировать со стороны сервера каждый пакет коротким уведомлением. Тогда можно будет по отсутствию квитанции быстро определить нештатные ситуации типа "порыв кабеля", сбои питания сетевой аппаратуры и т.п. Думаю, 1-2 сек это вполне реальное время ограничения таймаута ожидания квитанции. Кроме этого,такой способ позволяет синхронизировать производительность передающей и принимающей сторон и сетевой аппаратуры. Хотя непонятно,что делает Ваш клиент с данными после определения факта разыва (или просто если сервер не успевает читать данные от клиентов в нужном темпе), но это уже другая проблема:).
Здравствуйте SergeyRo, 16.04.2001 06:20:30 вы писали:
Ну я в данном случае посоветовал бы обратится к опыту ftp т.е.
сервер слушает один порт постоянно клиент коннектится к этому сокету собщает некоторую
информацию о себе затем обрывает соединение и доднимает у себя на прослушку 2 сокета
сервер лепится к клиенту по обоим сокетам причем один использует исключительно для приема а второй для квотации т.е
каждые N пакетов он сообщает клиенту что пакеты NN такието ок...
а клиент проверяет за какой пакт пакетов была последняя квотация и как давно
ну а дальше обрабатывает ошибки...
Или я не так понял задачу ?