c++ - 如何使用 QTcpSocket 监听 qt 中的特定端口?

标签 c++ qt sockets ubuntu

<分区>

我正在使用 QTcpSocket 在两个应用程序之间进行通信。一个是 C++ 程序,另一个是用 PHP 编写的网页。

目标是使用套接字将数据从我的网页发送到我的 C++ 程序。

我不知道如何在特定端口(例如 12345)上打开连接并监听它是否有任何数据..

到目前为止,我已经编写了以下代码:

主窗口.cpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    Mysocket = new QSocket(this);
    Mysocket->Initialization();
}

MainWindow::~MainWindow()
{
    delete ui;
}

QSocket.cpp

#include "qsocket.h"
#define SOCKET_PORT 12345
QSocket::QSocket(QObject *parent) :
    QObject(parent)
{
}


void QSocket::Initialization()
{
    //connected
    socket = new QTcpSocket(this);
    socket->connectToHost("localhost",SOCKET_PORT);
    connect(socket,SIGNAL(connected()),this,SLOT(connected()));
    connect(socket,SIGNAL(disconnected()),this,SLOT(disconnected()));
    connect(socket,SIGNAL(bytesWritten(qint64)),this,SLOT(bytesWritten(qint64)));
    connect(socket,SIGNAL(readyRead()),this,SLOT(readyRead()));
    if(!socket->waitForConnected(1000))
    {
        QMessageBox::StandardButton reply;
        reply = QMessageBox::question(0,"Error","Error in Socket Connection",
                                        QMessageBox::Yes|QMessageBox::No);
        socket->close();
    }
    socket80->close();
}
void QSocket::connected()
{
        QMessageBox::StandardButton reply;
        int PortNumber = socket->localPort();
        reply = QMessageBox::question(0,"Connected","Socket Connection is Established",
                                        QMessageBox::Yes|QMessageBox::No);

        qDebug()<<"I'm Listening to Port: "<<PortNumber<<"on the local host \n";
}

void QSocket::disconnected()
{
    qDebug()<<"Disconnected .... \n";
    socket->close();
}

void QSocket::bytesWritten(qint64 bytes)
{
        qDebug()<<"We wrote "<<bytes<<" \n";
}

void QSocket::readyRead()
{
    qDebug()<<"Reading .... \n";
    qDebug()<<socket->bytesAvailable();
    qDebug()<<socket->readAll();
}

当我运行这段代码时,它不会打开任何连接并给出错误,它会进入这个 if 语句..

if(!socket->waitForConnected(1000))
{
    QMessageBox::StandardButton reply;
    reply = QMessageBox::question(0,"Error","Error in Socket Connection",
                                    QMessageBox::Yes|QMessageBox::No);
    socket->close();
}

如果我将端口号更改为 80,它可以正常工作并且所有功能都可以正常工作。 通过阅读 SO 中的一些帖子,我意识到一个解决方案是使用 QTcpServer 但我没有任何具体经验。 这里有什么问题?!

附言

我的平台规范。

Ubuntu 13.10

Qt 5.2.1

最佳答案

您可以使用以下示例服务器。您可以通过调用 start_listen(int port_no) 开始监听端口。

#include <QtNetwork>
#include <QMessageBox>

class server : public QTcpServer {
    Q_OBJECT
public:
    explicit server(QObject *parent = 0);
    ~server();
    QTcpSocket server_socket;
public slots:
    void tcpReady();
    void tcpError( QAbstractSocket::SocketError error );
    bool start_listen(int port_no);
protected:
    void incomingConnection( int descriptor );
};

server::server(QObject *parent) : QTcpServer(parent) {
    connect( &server_socket, SIGNAL(error(QAbstractSocket::SocketError)),
            this, SLOT(tcpError(QAbstractSocket::SocketError)) );
    connect( &server_socket, SIGNAL(readyRead()),
             this, SLOT(tcpReady()) );
    server_socket.setSocketOption(QAbstractSocket::KeepAliveOption, true );
}

server::~server() {
    server_socket.disconnectFromHost();
    server_socket.waitForDisconnected();
}

void server::tcpReady() {
    QByteArray array = server_socket.read(erver_socket.bytesAvailable());
}

void server::tcpError(QAbstractSocket::SocketError error) {
    QMessageBox::warning( (QWidget *)this->parent(), tr("Error"),tr("TCP error: %1").arg( server_socket.errorString() ) );
}

bool server::start_listen(int port_no) {
    if( !this->listen( QHostAddress::Any, port_no ) ) {
        QMessageBox::warning( (QWidget *)this->parent(), tr("Error!"), tr("Cannot listen to port %1").arg(port_no) );
    }
    else
        return true;
}

void server::incomingConnection(int descriptor) {
    if( !server_socket.setSocketDescriptor( descriptor ) ) {
        QMessageBox::warning( (QWidget *)this->parent(), tr("Error!"), tr("Socket error!") );
        return;
    }
}

关于c++ - 如何使用 QTcpSocket 监听 qt 中的特定端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22930118/

相关文章:

c++ - 在 C++ 中为每个平台定义函数的首选方法是什么

c++ - 调用 qdecimal 库函数

c# - 与 C# 服务器的 Android TCP 通信 -> socket.Close

c++ - 如何选择正确的运算符重载

c++ - win32 程序是否应该始终是多线程的

c++ - 内联函数时出现链接器错误

c++ - QByteArray indexOf 已弃用?

c++ - Controller 和 View 之间的耦合

javascript - 了解 socket.io ping 间隔/超时设置

c++ - 为每个连接手动分配端口号