Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2009, 15:16   #1
_Инженер_
Пользователь
 
Регистрация: 19.06.2008
Сообщений: 32
По умолчанию Подскажите, пожалуйста, по сокетам

Разрабатываю следующую систему:
Есть компьютер преподавателя и 6 компьютеров учеников. С компьютера преподавателя произвольному ученику отправляется задание. Ученик выполняет задание и по завершению отправляет результаты обратно преподу. Затем препод по желанию может направить задание другим ученикам. Одновременно могут выполнять задания от 1-го до 6-ти соответственно учеников.
Как я это собираюсь делать и суть вопроса:
Я предполагаю решать это на основе сокетов. На компьютерах учеников после запуска системы запускаются нити, ожидающие запроса от преподавателя, и ждут подключения. У каждого ученика свой адрес порта, впрочем это детали. На компьютере преподавателя при необходимости отправить задание запускается нить для установления соединения с выбранным учеником. Дальше происходит соединение, обмен данными и все такое. Затем соединение закрывается, сокеты и процессы убиваются с обеих сторон. Держать соединение до завершения работы учеником мне видится нецелесообразным. На компе препода запускается нить, ожидающая обратного подключения от ученика. Сколько учеников, столько ждущих нитей. По завершению работы ученик отправляет результаты, на его компьютере запускается новая, ждущая следующего задания, нить.
Нормально ли выглядит схема? Не стоит ли заместо шести ожидающих нитей с разными номерами порта на компьютере преподавателя обойтись одной ибо все равно одновременно толкнувшихся учеников можно поочереди обработать? Есть ли какие-то ещё "неправильности" в моём изложении? Может вообще есть способ проще?
Заранее спасибо за помощь.

Последний раз редактировалось _Инженер_; 17.09.2009 в 16:32.
_Инженер_ вне форума Ответить с цитированием
Старый 17.09.2009, 16:19   #2
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Не знаю как там на счёт нитей, можно чтобы у препода была серверная часть программы (комонент TServerSocket) а у учеников клиентская часть (компонент TClientSocket). Настраиваем сервер и клиент на один порт. Клиенты конектятся к серверу и ожидают запроса. у TServerSocket есть св-во Connections[]. Выбирая i-тое соединение мы посылаем задание определённому ученику. Т. е. что то вроде чата
SERG1980 вне форума Ответить с цитированием
Старый 17.09.2009, 16:32   #3
_Инженер_
Пользователь
 
Регистрация: 19.06.2008
Сообщений: 32
По умолчанию

Цитата:
Сообщение от SERG1980 Посмотреть сообщение
Не знаю как там на счёт нитей, можно чтобы у препода была серверная часть программы (комонент TServerSocket) а у учеников клиентская часть (компонент TClientSocket). Настраиваем сервер и клиент на один порт. Клиенты конектятся к серверу и ожидают запроса. у TServerSocket есть св-во Connections[]. Выбирая i-тое соединение мы посылаем задание определённому ученику. Т. е. что то вроде чата
Ну то есть всё упростить, создать соединение с компом препода сразу при запуске программы? Я об этом думал, но как же быть, например, с тем, что отвалится сеть на секунду - на кабель кто-то наступит - и всё, надо заново запускать программы для установления соединения. Или я не прав и соединение сохранится при временном разрыве связи?
_Инженер_ вне форума Ответить с цитированием
Старый 17.09.2009, 16:44   #4
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Ну это на ваше усмотрение. У этих компонентов есть св-во Disconnect, Connect в котором можно что то сделать в случае потери (установки) связи.

Последний раз редактировалось SERG1980; 17.09.2009 в 16:50.
SERG1980 вне форума Ответить с цитированием
Старый 17.09.2009, 17:01   #5
_Инженер_
Пользователь
 
Регистрация: 19.06.2008
Сообщений: 32
По умолчанию

Цитата:
Сообщение от SERG1980 Посмотреть сообщение
Ну это на ваше усмотрение. У этих компонентов есть св-во Disconnect, Connect в котором можно что то сделать в случае потери (установки) связи.
Вообще я пока игрался только со "встроенными" в winsock функциями, не пользуясь вышеуказанными компонентами. Где-то видел сообщение об их глючности.
_Инженер_ вне форума Ответить с цитированием
Старый 18.09.2009, 08:52   #6
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

А вы попробуйте сначала, а потом можно и о глюках говорить, вроде работал с ними всё нормально было (хотя может просто повезло)
SERG1980 вне форума Ответить с цитированием
Старый 18.09.2009, 09:24   #7
_Инженер_
Пользователь
 
Регистрация: 19.06.2008
Сообщений: 32
По умолчанию

Что ж, спасибо за советы. Буду пробовать.
_Инженер_ вне форума Ответить с цитированием
Старый 02.10.2009, 17:11   #8
_Инженер_
Пользователь
 
Регистрация: 19.06.2008
Сообщений: 32
По умолчанию Каков максимальный размер переменной для передачи с помощью сокетов?

С общей организацией вроде как разобрался. Но по мере продвижения возникла новая проблема, которую никак не удаётся сдвинуть.
При передаче данных с помощью сокетов происходит следующее: если передаваемая переменная совсем умеренных размеров, например
string : = 'ААА!!! Мы все умрёёём!';
то, передача происходит без проблем,
Если беру рекорд, имеющий в своём составе 2 поля, представляющие собой массивы из двух элементов, то тоже всё работает.
Если же беру, скажем, двумерный массив строк три на тридцать, то функция recv отрабатывает, не возвращая ошибку, но выдаёт пустую переменную, куда я перекладываю входной буфер. Куда теряются данные? Во всех мануалах написано, что размер переменной не имеет значения.
-------------------------
выяснилось, что вообще массивы строк передавать не хочет - даже из трёх элементов

Последний раз редактировалось _Инженер_; 02.10.2009 в 17:56.
_Инженер_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача файла по сокетам bigmak Помощь студентам 1 24.03.2009 12:50
Вопрос по сокетам Garacio_cain Работа с сетью в Delphi 17 29.12.2008 17:22
Подскажите пожалуйста Dimanw92 Паскаль, Turbo Pascal, PascalABC.NET 2 24.09.2008 22:51
прередача по сокетам geronime Работа с сетью в Delphi 0 22.12.2007 11:27