通过仅建立一次TCP连接,将Recv从客户端发送到服务器套接字

时间:2017-08-18 16:23:11

标签: c++ sockets tcp

我正在使用C ++开发客户端/服务器解决方案。

从客户端,我将数据发送到我的服务器,并从此服务器发送到另一台服务器。我能够配置端口和IP地址,并且能够成功发送。

但是,另一台服务器(不在我身边)需要从我这边建立一个TCP连接,之后只需要发送和接收。

如果我连接两次(例如同时从两个客户端连接),则显示连接被拒绝。

部分代码如下所示:

while ((len = stream->receive(input, sizeof(input)-1)) > 0 )
{
    input[len] = NULL;
    //Code Addition by Srini starts here

    //Client declaration
    TCPConnector* connector_client = new TCPConnector();
    printf("ip_client = %s\tport_client = %s\tport_client_int = %d\n", ip_client.c_str(), port_client.c_str(),atoi(port_client.c_str()));
    TCPStream* stream_client = connector_client->connect(ip_client.c_str(), atoi(port_client.c_str()));

    //Client declaration ends
    if (stream_client)
    {
        //message = "Is there life on Mars?";
        //stream_client->send(message.c_str(), message.size());
        //printf("sent - %s\n", message.c_str());

        stream_client->send(input, sizeof(input));
        printf("sent - %s\n", input);
        len = stream_client->receive(line, sizeof(line));
        line[len] = NULL;
        printf("received - %s\n", line);
        delete stream_client;
    }

    //Code Additon by Srini ends here

    stream->send(line, len);
    printf("thread %lu, echoed '%s' back to the client\n",
        (long unsigned int)self(), line);
}

从客户端接收,发送到服务器,从服务器接收以及发送到客户端的完整线程代码显示在以下链接中:

https://pastebin.com/UmPQJ70w

如何更改设计流程?甚至在客户端/服务器程序的基本图中。当客户端调用connect()时,服务器每次调用accept(),然后发送/接收。那么,可以做些什么来修改流程,以便客户端只能连接一次?

1 个答案:

答案 0 :(得分:0)

您的中间服务器(充当代理,因此我们称之为)需要维护与其他服务器的单一连接,并与您的代理及其客户端之间的消息传递并行地委派消息传递。 / p>

我建议创建一个单独的线程,其唯一的任务是维护与其他服务器的连接,并用它发送/接收消息。

当客户端向您的代理发送消息时,将消息放在某个地方的线程安全队列中。让线程定期检查队列并将任何排队的消息发送到另一台服务器。

当其他服务器向您的代理发送消息时,该线程可以接收该消息并将其转发给相应的客户端。