Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Организация полноценного клиент/сервера на основе сокетов..

323
13 сентября 2004 года
Sergun
228 / / 20.09.2000
Добрый день..!
Проблема такова: стоит задача написания полноценного крупного клиент/серверного приложения. В нем клиент и сервер постоянно причем очень интенсивно обмениваются данными. Данные - это управляющие команды, а также непосредственно какие-то полезные данные (например таблицы, файлы итд), реализованные в виде потоков TMemoryStream.
Проблема в следующем. Я попытался реализовать такой сервер на основе TServerSocket/TClientSocket, однако, начались баги. Эти баги связаны с тем, что при интенсивном обмене например управляющими командами один из них доходят до клиента, другие - нет, например:
 
Код:
ClientSocket1->Socket->SendText("Cmd1");
ClientSocket1->Socket->SendText("Cmd2");


одна из них не дойдет до адресата...
то же самое и с потоками (SendStream, SendBuf)...
что делать - незнаю... может нужен новый подход на корню?
294
14 сентября 2004 года
Plisteron
982 / / 29.08.2003
Цитата:
Originally posted by Sergun
Добрый день..!


{поскипано...}

Цитата:

 
Код:
ClientSocket1->Socket->SendText("Cmd1");
ClientSocket1->Socket->SendText("Cmd2");


одна из них не дойдет до адресата...
то же самое и с потоками (SendStream, SendBuf)...
что делать - незнаю... может нужен новый подход на корню?


Связь случайно не диалапом (где байты-то теряются)?
Я бы реализовал примерно таким образом: саязь по протоколу UDP, а доставку контролировал бы своими средствами, т.е. как бы сам реализовывал 5 (сеансовый) уровень OCI, оптимизировав, насколько это возможно, под свою прогу.

323
14 сентября 2004 года
Sergun
228 / / 20.09.2000
Цитата:
Originally posted by Plisteron

{поскипано...}

Связь случайно не диалапом (где байты-то теряются)?



нет... насчет теряюстся.. я попутал малость.. они приходят как одно сообщение...

Цитата:
Originally posted by Plisteron
Я бы реализовал примерно таким образом: саязь по протоколу UDP, а доставку контролировал бы своими средствами, т.е. как бы сам реализовывал 5 (сеансовый) уровень OCI, оптимизировав, насколько это возможно, под свою прогу.



насчет UDP.. незнаю.. нужно ли мне это.. я бы лучше остался при TCP... только вот как заставить все работать.. может разъединить данные по разным портам?

1.1K
14 сентября 2004 года
teran
73 / / 15.04.2003
Цитата:
Originally posted by Sergun

нет... насчет теряюстся.. я попутал малость.. они приходят как одно сообщение...



Это потому, что при посылке сообщения функция сразу возвращает управление не дожидаясь его приема клиентом. Я тоже с подобным столкнулся, и перешел на чистые API сокеты.

294
15 сентября 2004 года
Plisteron
982 / / 29.08.2003
Цитата:
Originally posted by teran


Это потому, что при посылке сообщения функция сразу возвращает управление не дожидаясь его приема клиентом. Я тоже с подобным столкнулся, и перешел на чистые API сокеты.


Дык, оно и понятно, TCP... По усмотрению сервиса TCP несколько сообщений в рамках одного сеанса можно объединить в один TCP/IP пакет, вот оно всё всесте и принимается.

294
15 сентября 2004 года
Plisteron
982 / / 29.08.2003
Цитата:
Originally posted by Sergun

насчет UDP.. незнаю.. нужно ли мне это.. я бы лучше остался при TCP... только вот как заставить все работать.. может разъединить данные по разным портам?


Высылать следующую команду только после получения подтверждения приёма предыдущей.

323
15 сентября 2004 года
Sergun
228 / / 20.09.2000
Цитата:
Originally posted by teran


Это потому, что при посылке сообщения функция сразу возвращает управление не дожидаясь его приема клиентом. Я тоже с подобным столкнулся, и перешел на чистые API сокеты.



а ты бы не мог примеричк скинуть?
мой мыл: [email]sergun@hostel7.susu.ac.ru[/email]

1.1K
15 сентября 2004 года
teran
73 / / 15.04.2003
Цитата:
Originally posted by Sergun


а ты бы не мог примеричк скинуть?
мой мыл: [email]sergun@hostel7.susu.ac.ru[/email]



Ну тут я тебя немного дезинформировал переход на API проблему не убирает, просто я решил, что так будет лучше. А проблему эту я решил так - перед блоком данных передаю его размер. Если все таки хочешь посмотреть на исходники, то смотри аттач.
CClientSocket и CSocketServer - это базовые классы клиента и сервера (в них этого нету), а вот в CLantClient и CLantServer эта фишка как раз присутствует.

PS. За код строго не судить, он еще не отлажен и вообще :).

1.1K
15 сентября 2004 года
teran
73 / / 15.04.2003
Что-то файл не прикрепился, вторая попытка.
323
15 сентября 2004 года
Sergun
228 / / 20.09.2000
Да кстати меня еще такой вопрос интересует...
если посылаем:
Socket->SendText("ABCD");
Socket->SendText("EFGH");

то возможно ли что пакеты придут так:
AB CDEFGH
ABCDEF GH
итд...
т.е. строки будут делиться?
1.1K
15 сентября 2004 года
teran
73 / / 15.04.2003
Цитата:
Originally posted by Sergun
Да кстати меня еще такой вопрос интересует...
если посылаем:
Socket->SendText("ABCD");
Socket->SendText("EFGH");

то возможно ли что пакеты придут так:
AB CDEFGH
ABCDEF GH
итд...
т.е. строки будут делиться?



Насколько я знаю, если строки меньше чем размер пакета (около 1 кб), то такого быть не может. А вот если больше, то точно раздробятся.

323
15 сентября 2004 года
Sergun
228 / / 20.09.2000
Цитата:
Originally posted by teran


Насколько я знаю, если строки меньше чем размер пакета (около 1 кб), то такого быть не может. А вот если больше, то точно раздробятся.



так это точно или "насколько ты знаешь"??? :)))

1.1K
15 сентября 2004 года
teran
73 / / 15.04.2003
Цитата:
Originally posted by Sergun


так это точно или "насколько ты знаешь"??? :)))



100% гарантию дать не могу.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог