我正在使用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);
}
从客户端接收,发送到服务器,从服务器接收以及发送到客户端的完整线程代码显示在以下链接中:
如何更改设计流程?甚至在客户端/服务器程序的基本图中。当客户端调用connect()
时,服务器每次调用accept()
,然后发送/接收。那么,可以做些什么来修改流程,以便客户端只能连接一次?
答案 0 :(得分:0)
您的中间服务器(充当代理,因此我们称之为)需要维护与其他服务器的单一连接,并与您的代理及其客户端之间的消息传递并行地委派消息传递。 / p>
我建议创建一个单独的线程,其唯一的任务是维护与其他服务器的连接,并用它发送/接收消息。
当客户端向您的代理发送消息时,将消息放在某个地方的线程安全队列中。让线程定期检查队列并将任何排队的消息发送到另一台服务器。
当其他服务器向您的代理发送消息时,该线程可以接收该消息并将其转发给相应的客户端。