c++ - 同一台计算机上的 UDP 连接。 1 个服务器。多个客户端

标签 c++ qt sockets udp

在 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

enter image description here

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/

相关文章:

javascript - Node.js HTTP 和 TCP 客户端连接

c# - 将流与套接字一起使用的异步方法

c++ - 什么是模板<typename T, T t> 习语?

c++ - 如果我在析构函数中创建一个对象,会发生什么?

python - netcat 发送额外的 "X"UDP 数据包

c++ - QT线程,信号顺序

c++ - QMenu图标背景色

c++ - 使用声明的类或枚举

c++ - 字符串 (const char*, size_t) 到 int?

css - 使用 css 类和 setProperty() 无法更改 QWidget 的背景颜色