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

Ваш аккаунт

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

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

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

Многопоточный Tcp/ip сервер

1.7K
22 февраля 2006 года
ilyes
181 / / 22.02.2006
Люди добрые помогите. Я создал простой клиент который шлет сообщения серверу и сервер который создает для каждого подключения новый поток, все как показано на Борландовском сайте : http://bdn.borland.com/article/0,1410,26276,00.html
Сервер получает сообщения от клиента, и вроде отправляет сообщение обратно, но клиенту сообщение не доходит (даже OnRead не срабатывает).
13K
22 февраля 2006 года
poland
34 / / 16.01.2006
[QUOTE]Сервер получает сообщения от клиента, и вроде отправляет сообщение обратно, но клиенту сообщение не доходит (даже OnRead не срабатывает)./QUOTE]
Посмотри в отладчике код завершения отправки клиенту, м.б. сам поймешь.
1.7K
23 февраля 2006 года
ilyes
181 / / 22.02.2006
Не понял, че за код завершения, напиши по подробнее пожалуйста.
13K
26 февраля 2006 года
poland
34 / / 16.01.2006
Цитата:
Не понял, че за код завершения, напиши по подробнее пожалуйста.


Функция SendBuf(..) вообще говоря возвращает число реально переданных байт. Кроме того возможна генерация ESocketError при разных неприятностях с завершением thread.
Я в свое время реализовал именно то, что ты сейчас делаешь - многопоточный сокет-сервер и уже несколько лет все пашет без замечаний (оформлен как ActiveX - есть парный клиент). Для TSocketServer есть одна тонкость - нельзя использовать его методы внутри обработки его же событий. Т.е. в событии OnRead нельзя вызывать SendBuf, SendText. Мне пришлось реализовать внутренние списки сообщений для клиентов (потокозащищенные). За отправку клиентам отвечает отдельный поток.

1.7K
27 февраля 2006 года
ilyes
181 / / 22.02.2006
Цитата:
Originally posted by poland
Функция SendBuf(..) вообще говоря возвращает ...



Так в том то и дело, что сервер пишет что передал столько байт сколько надо (только не Socket->SendBuf, а TWinSocketStream->Write но вроде разницы нет), ошибок не возникает, и в TSocketServer я только на событии GetThread создаю новый SocketThread в котором переопределено сообщение ClientExecute и каждому клиенту выделяется свой поток и все говорят что отправляют сообщения правильной длины, но не до одного клиента сообщение не доходит :(, или может я тебя не правильно понял ???

13K
27 февраля 2006 года
poland
34 / / 16.01.2006
Цитата:
..в TSocketServer я только на событии GetThread создаю новый SocketThread в котором переопределено сообщение ClientExecute и каждому клиенту выделяется свой поток...


Вот может быть здесь и проблема, не получается в потоке обработки события организовать запись. Я был вынужден разорвать эту связь. Конкретно: для TSocketServer (stNonBlocking) определены события:
1)OnAccept, 2)OnClientConnect, 3)OnClientDisconnect, 4)OnClientRead, 5)OnClientError.
1и5) информационные; 2и3) работа со списком клиентов; 4) прием информации
Каждый клиент - это список сообщений+параметры логина. Отправка информации - размещение сообщения в списке клиентов.
Есть отдельный поток, который анализирует текущий список клиентов и отправляет (у меня SendText) подготовленные для него сообщения, если клиент готов(я опционально анализирую готовность клиента, т.к. их частично делали на VFP и они захлебывались).
При этом у меня очень туманные представления о TCP/IP, но все работает с десятками клиентов (часть модемные) неделями и гонять приходится килобайтами.
У клиента тоже есть тонкости, т.к. пакеты могут нарезаться и надо обеспечить их сборку.

1.7K
27 февраля 2006 года
ilyes
181 / / 22.02.2006
Да уж походу Blockeing клиент не реагирует на OnRead, придется в потоке ответ ждать, так вроде все работает.
1.7K
28 февраля 2006 года
ilyes
181 / / 22.02.2006
Вот блин, новая проблема возникла: до 10 Мбайт файлы пролетают просто супер, а вод если файл больше то почему-то начинает замедлятся(причем серьезно замедлятся). А с однопоточным серверов все нормально, ничего не замедляется.
1.7K
28 февраля 2006 года
ilyes
181 / / 22.02.2006
Извиняюсь, я проглючил, забыл MemoryStream->SetSize сделать...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог