Indy TCP / IP Server с клиентом с использованием библиотеки Chilkat

В настоящее время я пытаюсь использовать своего клиента с библиотекой Chilkat, поскольку клиент должен быть написан на Visual C ++, а не на Borland C ++ (C ++ Builder). Подключение действительно работает, но как только я пытаюсь отправить строку с клиента на сервер, она даже не попадает в функцию IdTCPServerExecute. Возможно ли вообще использовать для Клиента другую библиотеку, чем сервер? Если да, то как?

Изменить: у меня получилось, что клиент успешно отправляет строку на сервер. Теперь я обрабатываю сообщение клиента следующим образом:

UnicodeString Message = AContext->Connection->Socket->AllData();

Вместо:

UnicodeString Message = AContext->Connection->Socket->ReadLn();

Есть ли аналогичный вариант для отправки строки ответа с сервера?

        if (IdHTTP->Get
            ("http://*/index.php?option=com_bookpro&controller=customer&task=bpajaxlogin&username=" +
            slTokens->Strings[1] + "&password=" + slTokens->Strings[2] +
            "&product_id=" + Class) == "true") {
            AddLog("1");
            char* Response = "Test";
            AContext->Connection->Socket->Write(Response);
            AddLog("2");
        }
        else {
            AContext->Connection->Socket->WriteLn
                ("Authentication failed");

        }

Тоже доходит только до AddLog("1"); и не отображает AddLog("2");.

Клиентский код (с использованием Winsocks для тестирования банкомата):

recv(ConnectSocket, recvbuf, recvbuflen, 0);
printf("Bytes received: %d, %s\n", sizeof(recvbuf), recvbuf);

person user3553062    schedule 10.10.2015    source источник


Ответы (1)


В настоящее время я пытаюсь использовать своего клиента с библиотекой Chilkat, поскольку клиент должен быть написан на VCL C ++, а не на Borland C ++ (C ++ Builder).

Что такое «VCL C ++» по сравнению с «Borland C ++»? Вы имеете в виду компилятор командной строки Borland, а не компилятор C ++ Builder? Или вы имеете в виду совершенно другую стороннюю платформу VCL, которая не имеет ничего общего с платформой Borland VCL в C ++ Builder? Пожалуйста, проясните свой вопрос.

Подключение действительно работает, но как только я пытаюсь отправить строку с клиента на сервер, она даже не попадает в функцию IdTCPServerExecute.

Это трудно объяснить, не видя фактического серверного кода.

TIdTCPServer создает новый поток для каждого подключенного клиента. Событие TIdTCPServer::OnExecute не привязано к реальной сетевой активности, оно просто запускается в бесконечном цикле на время жизни каждого потока. Единственный способ, при котором событие OnExecute вообще не сработает, - это если:

  1. вы блокируете поток в событии TIdTCPServer::OnConnect, например, делая что-то, что не является потокобезопасным. Или вы делаете что-то, чтобы вызвать исключение, но не улавливаете его. Неперехваченное исключение завершит поток.

  2. клиент отключается, пока обработчик событий TIdTCPServer::OnConnect все еще работает, или в промежутке между временем после выхода обработчика событий и до того, как обработчик событий TIdTCPServer::OnExecute вызывается в первый раз.

Возможно ли вообще использовать для Клиента другую библиотеку, чем сервер?

Конечно, это возможно. TCP - это стандартизированный транспортный протокол. Пока разные реализации TCP соответствуют стандарту, они могут без проблем связываться друг с другом. Это фундамент для стабильной связи на нескольких платформах, и Интернет полагается на это.

person Remy Lebeau    schedule 10.10.2015