在 Qt Framework 上工作..,需要根据给定的要求获得解决方案
我已将一台服务器和 2 个客户端设为我的 PC: IP1、IP2、IP3是端口。
我的服务器正在监听 IP1,端口号 9999 我想将数据(数据报)发送到服务器,然后服务器需要响应我的客户端。 所以我可以知道客户端IP地址和客户端端口号。
服务器如何知道客户端 IP 地址和端口?,这是将响应返回给客户端所必需的。
注意:我在同一台 PC 上运行服务器、客户端 1 和客户端 2。
最佳答案
How client IP address and port knows to the server ?,
Ans: When datagram is recieved( readyRead signal is emited), you can use readDatagram API
socketServer.readDatagram(buffer.data(),buffer.size(),&sender,&port);
sender = IPaddress of client
por = portNumber of client.
这里是使用 Qt 的 QUDPSocket 的解决方案,1 个 UDP 服务器,在同一本地主机上有多个客户端,经测试它可以正常工作。必要时对代码进行注释
有两个控制台应用程序( UDPServer 和 UDPClient )
How to test
1. Run UDPServer, it will listen on port 9999
2. Run UDPClient(First instance )
3. Run UDPClient(second instance )
Result:
Please check below screenshot
UDP服务器代码
> main.cpp
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
UDPServer server;
return a.exec();
}
> UDPServer.h
#ifndef UDPSERVER_H
#define UDPSERVER_H
#include <QObject>
#include <QUdpSocket>
class UDPServer : public QObject
{
Q_OBJECT
public:
explicit UDPServer(QObject *parent = 0);
void WriteData( const QString& );
public slots:
void readReady();
private:
QUdpSocket socketServer;
};
#endif // UDPSERVER_H
> UDPServer.cpp
#include "UDPServer.h"
UDPServer::UDPServer(QObject *parent) :QObject(parent),socketServer(this)
{
qDebug()<<"I am UDP server, listening on 9999";
// Listen to 9999 port server
socketServer.bind(QHostAddress::LocalHost,9999 );
connect(&socketServer,SIGNAL(readyRead()),this,SLOT(readReady()));
}
void UDPServer::readReady()
{
QByteArray buffer;
buffer.resize(socketServer.pendingDatagramSize());
QHostAddress sender;
quint16 port;
socketServer.readDatagram(buffer.data(),buffer.size(),&sender,&port);
qDebug()<<"Datagram Recieved From";
qDebug()<<"Client IP" << sender.toString();
qDebug()<<"Client Port Number " << port;
qDebug()<<"\n\n";
// Write to the client,need to specify the client port number.
QByteArray clientData;
clientData.append( "data");
socketServer.writeDatagram( clientData, QHostAddress::LocalHost, port );
}
UDP客户端代码
> main.cpp
#include <QtCore/QCoreApplication>
#include "udpclient.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
UDPClient client;
client.WriteData("What is my IP");
return a.exec();
}
> udpclient.h
#ifndef UDPCLIENT_H
#define UDPCLIENT_H
#include <QObject>
#include <QUdpSocket>
class UDPClient : public QObject
{
Q_OBJECT
public:
explicit UDPClient(QObject *parent = 0);
void WriteData( const QString& );
public slots:
void readReady();
private:
QUdpSocket clientSocket;
};
#endif // UDPCLIENT_H
> udpclient.cpp
#include "udpclient.h"
UDPClient::UDPClient(QObject *parent) :QObject(parent), clientSocket(this)
{
qDebug()<<"I am your client";
connect(&clientSocket,SIGNAL(readyRead()),this,SLOT(readReady()));
}
void UDPClient::WriteData(const QString& data)
{
QByteArray clientData;
clientData.append( data);
// write to the port, listening by the server.
qDebug()<<"Writing datagram to 9999 port";
clientSocket.writeDatagram(clientData, QHostAddress::LocalHost, 9999 );
}
void UDPClient::readReady()
{
// got response from server, so clientSoclet port number can get.
qDebug()<< "Reacieved response from server through my port(Client port No):" << clientSocket.localPort();
QByteArray buffer;
buffer.resize(clientSocket.pendingDatagramSize());
QHostAddress sender;
quint16 port;
clientSocket.readDatagram(buffer.data(),buffer.size(),&sender,&port);
// To read server IP
qDebug()<< "Server IP Responded" << sender.toString();
qDebug()<< "Server Port Number" << port;
}
关于c++ - 同一台计算机上的 UDP 连接。 1 个服务器。多个客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18281425/