Организация полноценного клиент/сервера на основе сокетов..
Проблема такова: стоит задача написания полноценного крупного клиент/серверного приложения. В нем клиент и сервер постоянно причем очень интенсивно обмениваются данными. Данные - это управляющие команды, а также непосредственно какие-то полезные данные (например таблицы, файлы итд), реализованные в виде потоков TMemoryStream.
Проблема в следующем. Я попытался реализовать такой сервер на основе TServerSocket/TClientSocket, однако, начались баги. Эти баги связаны с тем, что при интенсивном обмене например управляющими командами один из них доходят до клиента, другие - нет, например:
ClientSocket1->Socket->SendText("Cmd2");
одна из них не дойдет до адресата...
то же самое и с потоками (SendStream, SendBuf)...
что делать - незнаю... может нужен новый подход на корню?
Добрый день..!
{поскипано...}
ClientSocket1->Socket->SendText("Cmd2");
одна из них не дойдет до адресата...
то же самое и с потоками (SendStream, SendBuf)...
что делать - незнаю... может нужен новый подход на корню?
Связь случайно не диалапом (где байты-то теряются)?
Я бы реализовал примерно таким образом: саязь по протоколу UDP, а доставку контролировал бы своими средствами, т.е. как бы сам реализовывал 5 (сеансовый) уровень OCI, оптимизировав, насколько это возможно, под свою прогу.
{поскипано...}
Связь случайно не диалапом (где байты-то теряются)?
нет... насчет теряюстся.. я попутал малость.. они приходят как одно сообщение...
Я бы реализовал примерно таким образом: саязь по протоколу UDP, а доставку контролировал бы своими средствами, т.е. как бы сам реализовывал 5 (сеансовый) уровень OCI, оптимизировав, насколько это возможно, под свою прогу.
насчет UDP.. незнаю.. нужно ли мне это.. я бы лучше остался при TCP... только вот как заставить все работать.. может разъединить данные по разным портам?
нет... насчет теряюстся.. я попутал малость.. они приходят как одно сообщение...
Это потому, что при посылке сообщения функция сразу возвращает управление не дожидаясь его приема клиентом. Я тоже с подобным столкнулся, и перешел на чистые API сокеты.
Это потому, что при посылке сообщения функция сразу возвращает управление не дожидаясь его приема клиентом. Я тоже с подобным столкнулся, и перешел на чистые API сокеты.
Дык, оно и понятно, TCP... По усмотрению сервиса TCP несколько сообщений в рамках одного сеанса можно объединить в один TCP/IP пакет, вот оно всё всесте и принимается.
насчет UDP.. незнаю.. нужно ли мне это.. я бы лучше остался при TCP... только вот как заставить все работать.. может разъединить данные по разным портам?
Высылать следующую команду только после получения подтверждения приёма предыдущей.
Это потому, что при посылке сообщения функция сразу возвращает управление не дожидаясь его приема клиентом. Я тоже с подобным столкнулся, и перешел на чистые API сокеты.
а ты бы не мог примеричк скинуть?
мой мыл: [email]sergun@hostel7.susu.ac.ru[/email]
а ты бы не мог примеричк скинуть?
мой мыл: [email]sergun@hostel7.susu.ac.ru[/email]
Ну тут я тебя немного дезинформировал переход на API проблему не убирает, просто я решил, что так будет лучше. А проблему эту я решил так - перед блоком данных передаю его размер. Если все таки хочешь посмотреть на исходники, то смотри аттач.
CClientSocket и CSocketServer - это базовые классы клиента и сервера (в них этого нету), а вот в CLantClient и CLantServer эта фишка как раз присутствует.
PS. За код строго не судить, он еще не отлажен и вообще :).
если посылаем:
Socket->SendText("ABCD");
Socket->SendText("EFGH");
то возможно ли что пакеты придут так:
AB CDEFGH
ABCDEF GH
итд...
т.е. строки будут делиться?
Да кстати меня еще такой вопрос интересует...
если посылаем:
Socket->SendText("ABCD");
Socket->SendText("EFGH");
то возможно ли что пакеты придут так:
AB CDEFGH
ABCDEF GH
итд...
т.е. строки будут делиться?
Насколько я знаю, если строки меньше чем размер пакета (около 1 кб), то такого быть не может. А вот если больше, то точно раздробятся.
Насколько я знаю, если строки меньше чем размер пакета (около 1 кб), то такого быть не может. А вот если больше, то точно раздробятся.
так это точно или "насколько ты знаешь"??? :)))
так это точно или "насколько ты знаешь"??? :)))
100% гарантию дать не могу.