使用Chilkat库编写TCP/IP服务器和客户端

Indy TCP/IP Server with Client using Chilkat Library

本文关键字:IP 服务器 客户端 TCP Chilkat 使用      更新时间:2023-10-16

我目前正在尝试使用我的客户端与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, %sn", sizeof(recvbuf), recvbuf);

我目前试图使用我的客户端与Chilkat库,因为客户端必须在VCL c++中编写,而不是Borland c++ (c++ Builder)。

与"Borland c++"相比,"VCL c++"是什么?您指的是Borland的命令行编译器,而不是c++ Builder编译器吗?或者你指的是一个完全不同的第三方VCL框架,与Borland的VCL框架在c++ Builder中没有任何关系?请澄清你的问题。

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

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

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

  1. 您在TIdTCPServer::OnConnect事件中死锁线程,例如通过做一些不线程安全的事情。或者,您正在做一些导致抛出异常的事情,而您没有捕获它。未捕获的异常将终止线程。

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

是否有可能为客户端使用其他库而不是服务器正在使用的库?

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