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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.01.2014, 21:50   #1
Oleg34
Пользователь
 
Регистрация: 09.09.2011
Сообщений: 48
По умолчанию Сокеты

В очередной раз обращаюсь за помощью. Подскажите, как организовать пересылку запроса. То есть, у меня клиент, один сервер-распределитель и несколько серверов-вычислителей. От клиента на сервер-распределитель приходит запрос. В зависимости от запроса, сервер-распределитель отсылает свой запрос на сервер-вычислитель. То есть в момент посылки запроса сервер-распределитель становится своеобразным клиентом.На форме сервера-распределителя я помещаю компоненты: ClientServer для связи с клиентом и ClientSocket для связи с сервером распределителем. Связь с клиентом и запрос на сервер распределитель осуществляю в void __fastcall TForm1::ServerSocket1ClientRead(TOb ject *Sender, .Но получаю ошибку:Project Project1.exe reised exception class ESocketError with message 'No adress specified' мол не указан адрес.
Код:
// ---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
    TCustomWinSocket *Socket) {
    // принятое сообщение от клиента
    AnsiString text_line = ServerSocket1->Socket->ReceiveText();
    try {
        /** ==================================================================== */
        /* =====================Регистрация серверов============================ */
        /* =========Регистрация сервера реализующего метод 1==================== */
        if (text_line[1] == '1') {
            Memo1->Lines->Add(" \r \n " + TimeToStr(Now())
                + " \r \n клиент с адресом : " +
                ServerSocket1->Socket->RemoteAddress +
                " \r \n номер порта клиента : " +
                ServerSocket1->Socket->RemotePort +
                " \r \n запрашивает метод № 1 " +
                "\r\n---------------------------------------------------");
            // посылка сообщения сервера клиенту метода 1
            ServerSocket1->Socket->SendText(TimeToStr(Now()) + " " +
                " Успешная регистрация метода 1 " +
                "\r\n-----------------------------------------------------");
                        //пытаюсь подключиться к серверу-вычислителю
            Form1->ClientSocket1->Active = true;
            if (Form1->ClientSocket1->Active == true) {
                ClientSocket1->Host = "127.0.0.1";
                ClientSocket1->Port = 1112;
                ClientSocket1->Open();
                Form1->ClientSocket1->Socket->SendText(text_line);
            }
            Memo1->Lines->Add("открыт порт:" + IntToStr(ClientSocket1->Port)
                + "\r\nна адрес:" + ClientSocket1->Host +
                "\r\n-------------------------------" + "\r\n" + text_line);
        }
    }

Последний раз редактировалось Stilet; 19.01.2014 в 11:31.
Oleg34 вне форума Ответить с цитированием
Старый 19.01.2014, 11:33   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не удивительно.
Ты открываешь сокет раньше чем указываешь ему хост.
Вот так пробуй:
Код:
                ClientSocket1->Host = "127.0.0.1";
                ClientSocket1->Port = 1112;
            Form1->ClientSocket1->Active = true;
            if (Form1->ClientSocket1->Active == true) {
                Form1->ClientSocket1->Socket->SendText(text_line);
            }
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.01.2014, 12:09   #3
Oleg34
Пользователь
 
Регистрация: 09.09.2011
Сообщений: 48
По умолчанию

Во, блин! Спасибо!
Oleg34 вне форума Ответить с цитированием
Старый 19.01.2014, 14:18   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Пожалуйста. Будь внимательней )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.01.2014, 19:40   #5
Oleg34
Пользователь
 
Регистрация: 09.09.2011
Сообщений: 48
По умолчанию

Блииин! Запутался: Последовательность действий от клиента приходит сообщение на сервер-распределитель:
Код:
//сервер-распределитель
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
	TCustomWinSocket *Socket) {
	AnsiString s = Socket->ReceiveText();
	/** *************************************************************** */
	if (s[1] == '1') {
//если от клиента пришло сообщение и первый символ '1'
//то
//открываю ClientSocket на порт и адрес другого сервера:
		   ClientSocket1->Host = "127.0.0.1";
                   ClientSocket1->Port = 1112;
                   Form1->ClientSocket1->Active = true;
            if (Form1->ClientSocket1->Active == true) {
// и пересылаю ему принятый от клиента текст:
             Form1->Button4Click(Form1);
                Form1->ClientSocket1->Socket->SendText(s);
            }
}
//все это неграмотно, но умнее не смог придумать:( 
//тут я никак не мог сообразить, как вызвать ф-ию
// ClientSocket1Read, поэтому кинул на форму
//кнопку, в ней прописал:

void __fastcall TForm1::Button4Click(TObject *Sender) {
	Form1->ClientSocket1->Socket->SendText(ss);
}
Сообщение отправляется на сервер-вычислитель:
Код:
//сервер-вычислитель
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
	TCustomWinSocket *Socket) {
	AnsiString s = Socket->ReceiveText();{
.......
.......}
//успешно прибыло и обработано и я его отправляю обратно
Socket->SendText(s);
}
теперь обратно возвращаюсь на сервер-распределитель:
Код:
//сервер-распределитель
void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
	TCustomWinSocket *Socket){
	String s = Socket->ReceiveText();
	if (s[1] == 'q') {
	  //	вот теперь, как дальше его отправить обратно клиенту
          //  ServerSocket1->Socket->SendText(s);  ?
          //  никак не могу сообразить.
	
	}
}
В какой последовательности и в каких событиях все это нужно делать)?

Последний раз редактировалось Stilet; 19.01.2014 в 19:47.
Oleg34 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сокеты gufon Работа с сетью в Delphi 0 21.06.2011 00:06
Сокеты IICuX123 Общие вопросы .NET 6 27.07.2009 01:27
Сокеты Raz0r Помощь студентам 2 29.04.2009 14:47
сокеты cross Работа с сетью в Delphi 2 21.12.2006 18:12