Добрый день. Прошу помочь мне разобраться с некоторыми вопросами. Пишется небольшое клиент-серверное приложение, практически полностью основаное на стандартном примере FortuneServer, FortuneClient. Клиент обращается к серверу, на стороне сервера генерируется рандомное чиселко и возвращается клиенту. Ниже приведены фрагменты кода:
Сервер:
Server::Server(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
...
tcpServer = new QTcpServer(this);
if(!tcpServer->listen(QHostAddress::Any)){
QMessageBox::critical(this, tr("SSP server"),
tr("Unable to start the server: %1")
.arg(tcpServer->errorString()));
close();
return;
}
tcpServer->setMaxPendingConnections(30);
statusLabel->setText(tr("The server is running on Port: %1\n"
"Run the SSP client now.")
.arg(tcpServer->serverPort()));
connect(tcpServer, SIGNAL(newConnection()), this, SLOT(sendServerType()));
.....
}
void Server::sendServerType()
{
QByteArray block;
quint16 sType = qrand()%3 + 1;
QDataStream out(&block,QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_4);
out<<sType;
QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
connect(clientConnection, SIGNAL(disconnected()),
clientConnection, SLOT(deleteLater()));
clientConnection->write(block);
clientConnection->disconnectFromHost();
}
Клиент:
Client::Client(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
....
CreateUI();
tcpSocket = new QTcpSocket(this);
connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(getServerType()));
connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError)));
....
}
void Client::CreateUI()
{
.....
//SUBMIT
submitButton = new QPushButton(tr("Submit"), this);
submitButton->setToolTip(tr("Send data to server"));
connect(submitButton, SIGNAL(clicked()), this, SLOT(submitButton_act()));
.....
}
void Client::submitButton_act()
{
tcpSocket->abort();
tcpSocket->connectToHost(serverHost, serverPort);
submitButton->setEnabled(false);
}
void Client::getServerType()
{
QDataStream in(tcpSocket);
in.setVersion(QDataStream::Qt_4_4);
int a = tcpSocket->bytesAvailable();
quint16 blockSize;
if(tcpSocket->bytesAvailable()<(int) sizeof(quint16))
return;
in>>serverType;
}
void Client::displayError(QAbstractSocket::SocketError socketError)
{
switch(socketError)
{
case QAbstractSocket::RemoteHostClosedError:
break;
case QAbstractSocket::HostNotFoundError:
QMessageBox::information(this, tr("SSP client"),
tr("The host was not found. Please check"
"the host name and port settings."));
break;
case QAbstractSocket::ConnectionRefusedError:
QMessageBox::information(this, tr("SSP client"),
tr("The connection was refused by the peer."
"Make sure the fortune server is running, "
"and check that the host name and port "
"settings are correct."));
break;
default:
QMessageBox::information(this, tr("SSP client"),
tr("The following error occured: %1.")
.arg(tcpSocket->errorString()));
}
}
Итак, имеется две проблемы:
1)Запускаю и клиент и сервер под Виндой на одной машине, сборку делаю в VS. Все великолепно пашет при обращении к серверу через локальный ip - 127.0.0.1 и даже при обращении к серверу через адрес машины в сети - в данном случае 10.52.19.115. Но стоит развести клиент и сервер на две разные машинки в сети, как все перестает работать - выдается ошибка "Connection was refused by the peer...". Не могу понять что не так - то ли я криво прописываю tcpServer->listen(QHostAdress::Any), то ли это просто какой-то затык в настройках файрволла или еще чего-то.
2)Вообще сервер надо собрать под линукс. но сейчас под рукой нет доступной оси, чтобы установить на неё Qt. Есть ли способы осуществить корректную кросс-компиляцию сервера из под винды для линукса. При этом я еще так понимаю надо будет пересобрать для в Release библиотеки QtCore4.dll, QtGui4.dll и QtNetwork4.dll. Как все это можно сделать?