使用QTcpSocket连接到20个不同的服务器后遇到超时

时间:2012-06-29 17:12:24

标签: c++ qt sockets networking tcp

我一直在使用QTcpSocket遇到一个奇怪的问题,我在网上搜索过但找不到其他有同样问题的人。

我有两个简单的应用程序,一个客户端和一个服务器,如果我在本地计算机上运行它们,则客户端成功地与服务器建立了所有50个连接。

如果我在连接到网络的另一台计算机上运行服务器(比方说:10.1.1.1),它每次都会再次连接而没有问题。

现在,如果我更改服务器的main.cpp以初始化不同端口(8001到8050)下的多个服务器,并更改客户端以与每个服务器建立一个连接。在本地运行它仍然可以正常工作。

int main(int argc, char** argv) {
  QCoreApplication app(argc, argv);

  for (int i = 8001; i <= 8050; ++i) {
    Server server(i);
    return app.exec();
  }
}

但是,如果我将服务器放在10.1.1.1上并再次尝试,那么我连接到前20个没有问题,但是它会挂起一段时间(任何时间超过5秒),然后连接到下一个20,等等,直到所有人都连接起来。

作为最后的测试,我将服务器的实例放在另一台机器(10.1.1.2)上,并在每台机器上创建了15个服务器实例,并尝试连接到两者同时我遇到了同样的问题。第一台机器中的所有15台连接都很好,第二台机器的下一台机器在挂起之前一直连接到最后10台。

这是在Qt版本4.7.2上。我在Fedora 17,Windows 7上遇到过这个问题,但是不是科学Linux 6。

下面包含客户端/服务器的代码,我删除了所有包含以节省一些垂直空间:

客户端

client.h

class Client: public QObject {
  Q_OBJECT

public:
  Client(QObject* parent = 0);
  ~Client();
  void start(QString address, quint16 port);

public slots:
  void startTransfer();
  void disconnect() { qDebug("disconnect"); }

private:
  QTcpSocket client;
};

client.cpp

Client::Client(QObject* parent): QObject(parent) {
  connect(&client, SIGNAL(connected()), this, SLOT(startTransfer()));
  connect(&client, SIGNAL(disconnected()), this, SLOT(disconnect()));
}

Client::~Client() {
  client.close();
}

void Client::start(QString address, quint16 port) {
  QHostAddress addr(address);
  qDebug(QString("connecting to %1:%2").arg(address, QString::number(port)).toLocal8Bit().constData());

  client.connectToHost(addr, port);
}

void Client::startTransfer() { 
  qDebug("connected");
  client.write("Hello, world", 13);
}

的main.cpp

int main(int argc, char** argv) {
  QCoreApplication app(argc, argv);

  for (int i = 0; i < 50; i++) {
    Client *client = new Client;
    client->start("192.168.0.1", 8888);
  }

  return app.exec();
}

服务器

server.h

class Server: public QObject {
  Q_OBJECT

public:
  Server(int port = 8888, QObject * parent = 0);
  ~Server();

public slots:
  void acceptConnection();
  void startRead();

private:
  QTcpServer server;
  QList<QTcpSocket *> clients;
};

server.cpp

Server::Server(int port, QObject* parent): QObject(parent) {
  qDebug(qPrintable("new server instance on port " + QString::number(port)));

  connect(&server, SIGNAL(newConnection()), this, SLOT(acceptConnection()));
  server.listen(QHostAddress::Any, port);
}

Server::~Server() {
  server.close();
}

void Server::acceptConnection() {
  QTcpSocket *client = server.nextPendingConnection();
  clients.append(client);

  connect(client, SIGNAL(readyRead()), this, SLOT(startRead()));
}

void Server::startRead() {
  QTcpSocket *client = dynamic_cast<QTcpSocket *>(sender());

  char buffer[1024] = {0};
  client->read(buffer, client->bytesAvailable());
  QString response = QString("%2 on server %3").arg(buffer, QString::number(server.serverPort()));
  std::cout << qPrintable(response) << std::endl;
  client->close();
}

的main.cpp

int main(int argc, char** argv) {
  QCoreApplication app(argc, argv);

  Server server;
  return app.exec();
}

0 个答案:

没有答案