libhv icon indicating copy to clipboard operation
libhv copied to clipboard

开启KCP后,改变udp的目标发送地址会无法正常通讯

Open firemeatman opened this issue 1 year ago • 1 comments

当我开启KCP后,我想通过udpClient给多个主机发送消息,但是我发现中途改变hio的目标地址会造成通讯异常。

下面这段代码中,我用定时器定时向服务器发送消息,每次都重新设置sendto的目标地址。但这会造成服务端那边只收到一次消息,后面的消息都收不到。如果不改变sendto的目标地址就不会发生这种情况。

    GlobalData::udpClient.loop()->setInterval(3000, [](hv::TimerID timerID) {
        sockaddr_u target_sockaddr;
        sockaddr_set_ipport(&target_sockaddr, "服务器地址", 1240);
        int res = GlobalData::udpClient.sendto("test msg!!!", &(target_sockaddr.sa));
        qDebug("send udp res: %d", res);
    });

如果这个不是bug,那么我是不是要像TCP一样,每次与不同的主机通讯的时候,我都要为每个地址都创建套接字才行。

firemeatman avatar Apr 15 '24 08:04 firemeatman


#include "hv/UdpClient.h"
#include "hv/EventLoop.h"
#include "hv/sockaddr.h"
#include <QDebug>

using namespace hv;

class GlobalData {
public:
    static UdpClient udpClient;
};

UdpClient GlobalData::udpClient;

int main() {
    // 初始化UDP客户端
    GlobalData::udpClient.createsocket(1240); // 本地端口
    GlobalData::udpClient.start();

    // 定时器定时向服务器发送消息
    GlobalData::udpClient.loop()->setInterval(3000, [](TimerID timerID) {
        sockaddr_u target_sockaddr;

        // 每次发送时设置不同的目标地址
        static int counter = 0;
        if (counter % 2 == 0) {
            sockaddr_set_ipport(&target_sockaddr, "服务器地址1", 1240);
        } else {
            sockaddr_set_ipport(&target_sockaddr, "服务器地址2", 1240);
        }
        counter++;

        // 发送消息
        int res = GlobalData::udpClient.sendto("test msg!!!", &(target_sockaddr.sa));
        qDebug("send udp res: %d", res);
    });

    // 运行事件循环
    GlobalData::udpClient.loop()->run();

    return 0;
}

ljluestc avatar Jan 26 '25 21:01 ljluestc