Название: QTcpServer, доступ к серверу с интернета(внешки)
Отправлено: Mobelis от Август 03, 2010, 16:24
Всем доброго дня. Вот решил разобраться как создать средствами Qt сервер который бы принимал данные от клиента и в последующем их обрабатывал. Имеется выделенный(реальный) IP адрес. Хотелось бы запустить сервер и ждать подключения клиента. Но не с локальной сети а именно с интернета. Сервер написать и собрать с примеров получилось и он отлично работает на домашнем компьютере клиент программа присоединяется и сообщения отправляются на сервер и передаются клиенту обратно. Но вот почему то как вписываю свой IP и пытаюсь запустить сервер то выдает ошибку The address is not available.Привожу листинг сервера: vvv.hC++ (Qt) #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.cppC++ (Qt) #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.cppC++ (Qt) #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("Server is not working " + m_ptcpServer->errorString()); m_ptcpServer->close(); return; } ui.label_3->setText("Server is working"); 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); }
Название: Re: QTcpServer, доступ к серверу с интернета(внешки)
Отправлено: Zmeishe от Август 13, 2010, 13:25
У меня отлично работает.
listen(QHostAddress::Any, nPort);
Название: Re: QTcpServer, доступ к серверу с интернета(внешки)
Отправлено: Edynchik от Ноябрь 15, 2010, 11:22
вопрос по клиенту...
Название: Re: QTcpServer, доступ к серверу с интернета(внешки)
Отправлено: Edynchik от Ноябрь 26, 2010, 17:49
а можете подлиться клиентом к данному серверу, FortuneClient Тоже в принципе соединяется...только хотелось бы видеть картину в целом, да и переделать FortuneClient не шибко получается...
|