Я создал один сервер в своем приложении QT и клиент в приложении, отличном от qt.
Код моего сервера в приложении QT выглядит следующим образом:
#ifndef MMI_TCPSERVER_H
#define MMI_TCPSERVER_H
#include <QTcpServer>
#include <QTcpSocket>
#include "MMISimForm.h"
class MyTcpServer : public QTcpServer
{
Q_OBJECT
public:
MyTcpServer(MMISimForm *simForm, int portNo);
void startServer();
private:
int portNo_;
MMISimForm* simForm_;
QTcpSocket *socket;
void OnConnected();
protected:
void incomingConnection(qintptr socketDescriptor);
public slots:
void OnReadyRead();
void OnDisconnected();
};
#endif
#include "MyTcpServer.h"
MyTcpServer::MyTcpServer(MMISimForm *simForm, int portNo) :
simForm_(simForm), portNo_(portNo)
{
portNo_ = portNo;
}
void MyTcpServer::startServer()
{
if(!this->listen(QHostAddress::Any, portNo_))
{
//qDebug() << "Could not start server";
}
else
{
//qDebug() << "Listening to port " << portNo_ << "...";
}
}
void MyTcpServer::incomingConnection(qintptr socketDescriptor)
{
socket = new QTcpSocket();
// set the ID
if(!socket->setSocketDescriptor(socketDescriptor))
{
//OnErrorSocket(socket->error());
return;
}
else
{
simForm_->logMessage("Server Started");
socket->setSocketOption(QAbstractSocket::KeepAliveOption, 1);
//OnConnected();
}
// connect socket and signal
// note - Qt::DirectConnection is used because it's multithreaded
// This makes the slot to be invoked immediately, when the signal is emitted.
connect(socket, SIGNAL(readyRead()), this, SLOT(OnReadyRead()), Qt::DirectConnection);
connect(socket, SIGNAL(disconnected()), this, SLOT(OnDisconnected()));
}
// TcpServer
//---------------------------------------------------------------------------
//
// Reads incoming TCH command
void MyTcpServer::OnReadyRead()
{
const QString cmdStr(socket->readAll());
simForm_->logMessage("Server Started");
}
void MyTcpServer::OnDisconnected()
{
simForm_->logMessage("Server Closed");
}
, а код клиента - в моем не qt-приложении
#include "ServerSocket.h"
ServerSocket::ServerSocket()
{
WSAStartup(0x0101, &w) != 0;
/* Open a datagram socket */
sd = socket(AF_INET, SOCK_STREAM, 0);
/* Clear out server struct */
memset((void *)&server, '\0', sizeof(struct sockaddr_in));
server.sin_family = AF_INET;
server.sin_port = htons(5000);
server.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
connect(sd, (struct sockaddr *)&server, sizeof(server));
}
И у меня есть одна функция отправки, которая отправляет данные на сервер как
int ServerSocket::sendData()
{
send(sd , "hello" , strlen("hello") , 0 );
}
Я проверил возвращаемое значение функции отправки, которое приходит как 5 средних байты данных отправляются правильно.
Но сигнал readyRead не посылается. Поэтому я не могу захватить данные в QT.
Что я делаю неправильно? QT GUI событие l oop работает правильно (приложение: exe c ()).