0

我目前正在尝试将我的客户端与 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 进行 atm 测试):

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

1 回答 1

0

我目前正在尝试将我的客户端与 Chilkat 库一起使用,因为客户端必须用 VCL C++ 而不是 Borland C++(C++Builder) 编写。

与“Borland C++”相比,“VCL C++”是什么?您是指 Borland 的命令行编译器,而不是 C++Builder 编译器吗?还是你指的是完全不同的第三方VCL框架,和Borland的C++Builder中的VCL框架没有关系?请澄清你的问题。

连接确实有效,但是一旦我尝试将字符串从客户端发送到服务器,它甚至都没有命中 IdTCPServerExecute 函数。

如果没有看到您的实际服务器代码,这很难解释。

TIdTCPServer为每个连接的客户端创建一个新线程。该TIdTCPServer::OnExecute事件与实际的网络活动无关,它只是在每个线程的生命周期内无限循环地触发。OnExecute根本不会触发事件的唯一方法是:

  1. 您在TIdTCPServer::OnConnect事件中使线程死锁,例如通过执行非线程安全的操作。或者,您正在做某事导致抛出异常而您没有捕获它。未捕获的异常将终止线程。

  2. 客户端在事件处理程序仍在运行时断开连接TIdTCPServer::OnConnect,或者在事件处理程序退出之后和TIdTCPServer::OnExecute第一次调用事件处理程序之前的时间之间断开连接。

甚至可以为客户端使用另一个库而不是服务器使用的库?

当然这是可能的。TCP 是一种标准化的传输协议。只要不同的 TCP 实现遵循该标准,它们就可以毫无问题地相互通信。这是跨平台稳定通信的基础,互联网依赖于此。

于 2015-10-10T04:12:16.460 回答