crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Помогите с решением проблемы клиент-сервер
Гость_KoNEW_*
сообщение 19.5.2010, 12:58
Сообщение #1





Гости








    


Добрый день. Прошу помочь мне разобраться с некоторыми вопросами. Пишется небольшое клиент-серверное приложение, практически полностью основаное на стандартном примере 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. Как все это можно сделать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kibsoft
  опции профиля:
сообщение 19.5.2010, 13:46
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 180
Регистрация: 21.7.2009
Из: Самара
Пользователь №: 928

Спасибо сказали: 14 раз(а)




Репутация:   2  


1)
 if (socket->waitForConnected(1000))
     qDebug("Connected!");

Попробуй немного подождать соединения(возможно сеть лагает). Тут 1 секунду ждем, но если в функцию ничего не передавать 30 сек по умолчанию.

2) Думаю это невозможно. Лучше скачай Linux.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.11.2020, 16:18