crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> QTcpServer, доступ к серверу с интернета(внешки)
Mobelis
  опции профиля:
сообщение 3.8.2010, 15:57
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 3.8.2010
Пользователь №: 1927

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




Репутация:   0  


Всем доброго дня. Вот решил разобраться как создать средствами Qt сервер который бы принимал данные от клиента и в последующем их обрабатывал. Имеется выделенный(реальный) IP адрес. Хотелось бы запустить сервер и ждать подключения клиента. Но не с локальной сети а именно с интернета. Сервер написать и собрать с примеров получилось и он отлично работает на домашнем компьютере клиент программа присоединяется и сообщения отправляются на сервер и передаются клиенту обратно. Но вот почему то как вписываю свой IP и пытаюсь запустить сервер то выдает ошибку The address is not available.

Привожу листинг сервера:
vvv.h

 
#ifndef VVV_H
#define VVV_H

#include "ui_vvv.h"
#include <QtGui/QMainWindow>
#include <QtNetwork/QTcpServer>
#include <QtNetwork/QTcpSocket>

class QTcpServer;
class QTcpSocket;

class vvv : public QMainWindow
{
    Q_OBJECT

protected:
    void sendToClients(const QByteArray& line);

private:
    Ui::vvvClass ui;
    QTcpServer* m_ptcpServer;
    quint16     m_nNextBlockSize;
    void sendToClient(QTcpSocket* pSocket, const QString& str);

public:
vvv(QWidget *parent = 0, Qt::WFlags flags = 0);

~vvv();

private slots:
    void on_Button1_clicked();
    void slotNewConnection();
    void slotReadClient();
};
#endif // VVV_H

main.cpp
#include "vvv.h"
#include <QtGui/QApplication>
#include <QtCore/QTextCodec>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
    vvv w;
    w.show();
    return a.exec();
}

vvv.cpp
#include "vvv.h"
#include <QtGui>

vvv::vvv(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    ui.setupUi(this);
}
vvv::~vvv()
{
}

void vvv::on_Button1_clicked()
{
    m_ptcpServer = new QTcpServer(this);
    if (!m_ptcpServer->listen(QHostAddress(ui.lineEdit_2->text()) , ui.lineEdit_3->text().toInt())) {            
    ui.label_3->setText("Сервер не работает " + m_ptcpServer->errorString());
    m_ptcpServer->close();
    return;
    }

    ui.label_3->setText("Сервер работает");

    connect(m_ptcpServer, SIGNAL(newConnection()),
    this,         SLOT(slotNewConnection())
    );
}
void vvv::slotNewConnection()
{

    QTcpSocket* pClientSocket = m_ptcpServer->nextPendingConnection();
    connect(pClientSocket, SIGNAL(disconnected()),
            pClientSocket, SLOT(deleteLater())
           );
    connect(pClientSocket, SIGNAL(readyRead()),
            this,          SLOT(slotReadClient())
           );
    ui.label_3->setText("Server Response: Connected!");
    sendToClient(pClientSocket, "Server Response: Connected!");
}

void vvv::slotReadClient()
{

QTcpSocket* pClientSocket = (QTcpSocket*)sender();
    QDataStream in(pClientSocket);
    in.setVersion(QDataStream::Qt_4_2);

        in >> m_nNextBlockSize;
        QTime   time;
        QString str;
        in >> time >> str;

QString strMessage =time.toString() + " " + "Client has sended - " + str;

ui.textEdit->append(strMessage);

m_nNextBlockSize = 0;    

sendToClient(pClientSocket,"Server Response: Received \"" + str + "\"");
}

void vvv::sendToClient(QTcpSocket* pSocket, const QString& str)
{
    QByteArray  arrBlock;
    QDataStream out(&arrBlock, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_2);
    out << quint16(0) << QTime::currentTime() << str;

    out.device()->seek(0);
    out << quint16(arrBlock.size() - sizeof(quint16));

    pSocket->write(arrBlock);
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.8.2010, 17:22
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


а так получается ?
m_ptcpServer->listen(QHostAddress( QHostAddress::Any) , ui.lineEdit_3->text().toInt())
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Mobelis
  опции профиля:
сообщение 3.8.2010, 17:59
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 3.8.2010
Пользователь №: 1927

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




Репутация:   0  


Цитата(Алексей1153 @ 3.8.2010, 17:22) *
а так получается ?
m_ptcpServer->listen(QHostAddress( QHostAddress::Any) , ui.lineEdit_3->text().toInt())


Пробовал приконектиться получается только по внутри сетевому адресу ну или через локальный. Через внешний не получается.

Загрузил весь проект Может у кого есть возможность его запустить и проверить именно запускается ли он и виден ли с интернета не с локальной сети.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.8.2010, 18:29
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


Цитата(Mobelis @ 3.8.2010, 20:59) *
Через внешний не получается

а маршрут в модеме (или что у тебя там) настроен? Файервол не режет ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Mobelis
  опции профиля:
сообщение 3.8.2010, 18:47
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 3.8.2010
Пользователь №: 1927

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




Репутация:   0  


В этом то и дело что тот же Апач ФТП сервер все работают и видны с внешки. А вот сервер даже запустить не хочет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Mobelis
  опции профиля:
сообщение 4.8.2010, 7:59
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 3.8.2010
Пользователь №: 1927

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




Репутация:   0  


И так методом проб и ошибок удалось запустить сервер и получить доступ к нему из вне. Вся причина именно в прослушивании самого айпишника... Я Записал IP в host файл задал ему имя server вписал его место IP в сервер приложении и сервер запустился. Вопрос что мешает серверу запускаться напрямую с IP адреса. Что еще более необычно я не могу клиентом через внешний ip адрес присоединиться к серверу. Зато люди спокойно присоединяются. Так же не могу сам себя пропинговать. Может что у провайдера не так настроено ? И на последний вопрос я даже видел его задавали где то но я упустил где именно на форуме. Какое бы число клиентов не присоединилось к серверу он создает каждому свой поток и по нему дает обратный ответ. Но а что если хотеться попробовать реализовать что то наподобие icq что бы сервер ретранслировать данные между патока ми в зависимости от какого абонента направлено сообщение другому абоненту.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 4.8.2010, 8:19
Сообщение #7


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


покажи в виде текста, как ты IP серверу подавал? То есть результат ui.lineEdit_2->text() покажи

И вообще зачем привязался к IP - при создании сервера только порт нужен, а IP будет использоваться машины (в общем случае)

ps
А ты ранее создавал сервер-клиентские приложения ?

Сообщение отредактировал Алексей1153 - 4.8.2010, 8:20
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 16.4.2024, 15:59