如何使用QTcpSocket侦听qt中的特定端口
how to listen to a specific port in qt using QTcpSocket?
我使用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,但我在这方面没有任何具体的经验。这里有什么问题?!
p.S.
我的平台规范。
Ubuntu 13.10
问题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;
}
}
相关文章:
- 如何使用 QDatastream 通过 QTcpSocket 发送 QSqlQueryModel?
- QTcpServer/QTcpSocket:使用 QDataStream 与直接发送 UTF-8 数据
- 如何使用QTcpSocket读取超过8192字节?
- 使用 QTcpSocket 实现连续快速使用
- 如何使用 QTcpSocket 发送 JSON
- 无法使用<double> QTcpSocket 和 QDataStream 在服务器和客户端之间传输 QVector
- 如何使用 QDataStream 从 QTcpSocket 读取类对象?
- 使用 LLVM 的 libc++ 时,__1 符号从何而来?
- 使用QTcpSocket时出错
- 在std::cout之后使用std::cin时,换行符从何而来
- 使用QTcpSocket时是否需要缓冲区
- 使用 QTcpSocket 发送字节
- 使用 QDataStream 从 QTcpSocket 读取
- 如何在多线程中使用 QTcpSocket
- 使用QTcpSocket接收终端向上/向下键
- 使用QTcpSocket和QTcpServer的Qt双向客户端服务器
- 在deleteLater之后,我可以再次使用QTcpSocket进行另一个连接吗?
- 冻结使用QTcpSocket发送大文件
- 如何使用QTcpSocket侦听qt中的特定端口
- 如何以几秒间隔多次使用 QTcpSocket 实例