Code Monkey home page Code Monkey logo

Comments (15)

ywwyewenwei avatar ywwyewenwei commented on May 18, 2024

我的编译环境
WSL2+UBUNTU 20.04, gcc, cmake
QMake version 3.1
Using Qt version 5.12.8 in /usr/lib/x86_64-linux-gnu

from qtnetworkng.

hgoldfish avatar hgoldfish commented on May 18, 2024

能够附加详细的测试代码。现在你给的代码片段,我难以编译与测试。可以考虑在你的 github 里面创建一个仓库,我去看看。

from qtnetworkng.

ywwyewenwei avatar ywwyewenwei commented on May 18, 2024

能够附加详细的测试代码。现在你给的代码片段,我难以编译与测试。可以考虑在你的 github 里面创建一个仓库,我去看看。

尊敬的作者,您好!
请看上面的问题二,用的是您的源码中的tests文件夹下的test_kcp.cpp测试的。

from qtnetworkng.

hgoldfish avatar hgoldfish commented on May 18, 2024

这个测试代码是早期写的。看起来是因为当时没有考虑到两个问题:

  1. 如果调用函数没有放弃协程,KCP 后台就没办法发送数据,我现在通过在 KcpSocket::send() 函数里面添加中断点解决这个问题。

  2. 没有等待服务端关闭连接就直接退出,导致后台正在发送数据的协程也中断了,要么根本没有发送数据,要么发送到一半就中断掉。这个问题通过在客户端添加一个 s.recv(1024) 等待服务端关闭能起效果。

    const QByteArray &eof = s.recv(1024); // 等待 qtng 在后台协程发送数据,发送数据完毕,服务器关闭连接时返回 0
    Q_ASSERT(eof.isNull());
    const QString &message = QStringLiteral("client sha256= %1").arg(QString::fromLatin1(m.hexDigest()));
    qDebug() << message;

这段代码在写普通 TCP 时不需要是因为操作系统内核一直在运行,即使应用层关闭了连接也退出程序,但操作系统一定会帮我们把内核缓冲区剩余的数据发送完毕才会真正关闭连接。但我们不是内核,程序退出就什么都没有了,所以需要这个 s.recv(1024);等待远程关闭。

from qtnetworkng.

ywwyewenwei avatar ywwyewenwei commented on May 18, 2024

作者您好!
非常感谢您及时解决了问题二,test_kcp的server端有动作。
问题三目前依旧存在,重现办法:
1、按照前面问题三,编译server端,QtL2Handler是一个继承自BaseRequestHandler的类,不需要有实际的代码;
2、在socket_server.cpp的第144 、145设置断点,启动server;
3、断点处:
void BaseStreamServerPrivate::serveForever()
{
    Q_Q(BaseStreamServer);
    q->started->set();
    q->stopped->clear();
    while (true) {
        QSharedPointer request = q->getRequest();
        if (request.isNull()) {
            break;
        }
...
144行,server运行后,会触发144行的断点,即q->getRequest();这一行,按F5继续执行,会阻塞在这个函数里;
4、将前面编译的test_kcp,修改client函数中端口与server一致,执行;
5、可以发现,server端的断点一直没有触发,即server端一直在q->getRequest()里,没执行到if (request.isNull()) {这一行(145行)。

    我这个测试的目的,是检测server端能否得到来自客户端的连接。虽然test_kcp是带协议的,但他们的连接过程应该这样测试没问题吧?
   再次表示感谢!

from qtnetworkng.

hgoldfish avatar hgoldfish commented on May 18, 2024

没有代码我还是很难看明白是什么问题。我提交了一个新的 test_kcpserver.cpp 的代码,可以看看是不是符合你的要求。

from qtnetworkng.

ywwyewenwei avatar ywwyewenwei commented on May 18, 2024

好的,看到了,我马上测试。

from qtnetworkng.

ywwyewenwei avatar ywwyewenwei commented on May 18, 2024

您好!您好!
可喜的进步!!!经过初步的编译调试,这个版本可以从QSharedPointer request = q->getRequest();这个语句中获取到新建立的链接,后续的完整的数据测试,我稍晚会给出结果。
感谢!!!

from qtnetworkng.

ywwyewenwei avatar ywwyewenwei commented on May 18, 2024

作者您好!
后续测试的结果:
1、test_kcpserver 和 test_kcp 可以正常在ubuntu 20.04.6下工作;
2、在ubuntu下运行test_kcpserver,而客户端是在windows11的情况下,test_kcpserver没能建立连接,目前正在排查问题。
windows下面的客户端代码如下:
m_socket = new qtng::KcpSocket();
if (m_socket->connect("xx.xx.xx.xx", 7943))
{
m_socket->setMode(qtng::KcpSocket::Internet);
m_socket->setSendQueueSize(32);
//m_socket->setMode(qtng::KcpSocket::Loopback);
m_socket->setUdpPacketSize(1024 * 16);
m_bConnected = true;
SendLoginReq();
return true;
}

from qtnetworkng.

hgoldfish avatar hgoldfish commented on May 18, 2024

test_kcpserver 里面绑定的是 Localhost,你得把它变成 HostAddress::AnyIPv4

from qtnetworkng.

ywwyewenwei avatar ywwyewenwei commented on May 18, 2024

尊敬的作者,您好!
您提到的这个Localhost我已经注意到了,并且为了排除更多范围,我特意做了三个平台上的对比测试,所以花了不少时间,现在将有意义的信息提供给您:
1、在云服务器上,以调试方式运行test_kcpserver,地址已经正确绑定,并且看到执行了QSharedPointer request = q->getRequest();,并且阻塞;
2、在我本地的电脑(windows 64 bit)上的WSL环境(ubuntu 20.04.6)下,重新编译qtnetworkng,包括tests,运行其中的test_kcp 工作一切正常,传递的参数是云服务器的外部IP地址,可以看到云服务器那里成功建立了连接,这说明云服务器绑定的IP地址、防火墙等等都正常工作;
3、在本地电脑Windows 11 64bit 环境下,我用的VS Studio 2022 + QT 5.15.2,编译了qtnetworkng,生成Lib,然后基于QT做了一个UI程序,代码如下:
m_socket = new qtng::KcpSocket();
if (m_socket->connect("xx.xx.xx.xx", 7943))
{
m_socket->setMode(qtng::KcpSocket::Internet);
m_socket->setSendQueueSize(32);
//m_socket->setMode(qtng::KcpSocket::Loopback);
m_socket->setUdpPacketSize(1024 * 16);
m_bConnected = true;
SendLoginReq();
return true;
}
运行这个windows客户端,发现server端没有建立连接。

4、在云服务器上,编译tests的时候,SSL用的是默认的libssl吧?
我windows11下编译的时候,使用的是OpenSSL。不知道是否与这个有关?

from qtnetworkng.

ywwyewenwei avatar ywwyewenwei commented on May 18, 2024

进展:将tests在windows11下 编译,出来的 test_kcp.exe 工作正常!

from qtnetworkng.

ywwyewenwei avatar ywwyewenwei commented on May 18, 2024

终于找到了问题:
就如同前面您说的,客户端发送数据之后,必须马上执行一次const QByteArray &eof = s.recv(1024);
这样,才能保证把数据真正发走。
这么操作,对于普通的console程序来说没什么问题,但是对GUI程序来说,很是困扰。
GUI程序,通常数据的发送和接收是不在一起的。要么是发送后,用定时查询是否有数据,或者传统的QT程序用connect信号槽方式,当有数据的时候通知到本程序去读取。
而目前KcpSocket未实现QT的信号槽,如果每次发送一段数据给服务器之后再马上recv的话,不仅做法很怪异,还会造成程序卡顿,因为recv是同步的。

不知这个问题如何解决?
非常感谢您的努力!

from qtnetworkng.

hgoldfish avatar hgoldfish commented on May 18, 2024

恰恰相反。如果都是做 GUI 程序,s.recv(1024) 这个代码是可以不用写的。这段代码主要是为了保证命令行程序不马上退出,你写个 Coroutine::sleep(3600) 也行,只要程序不立马退出就能有效果。

我估计你没有写个新的协程要运行你的这段代码。如果是写 GUI 程序,你可以参考一下文档的 GUI 示例,写法和命令行程序有所区别,不能直接调用这些 Socket 的函数,而必须创建协程,在协程里面调用。

建议你把你的测试工程打包发到 Github 上面,比较方便我给出开发建议。

from qtnetworkng.

ywwyewenwei avatar ywwyewenwei commented on May 18, 2024

谢谢您的建议!
如果从头做一个项目,我很愿意这么做,客户端也是基于协程的了。
现有的项目基于C/S架构,客户端用的是QTcpSocket和服务器端通讯,并且是工作在一个独立于UI的线程之中。目前都已经正常工作的了。
等后续若做项目,很乐意从头做这么一个尝试。
谢谢!

from qtnetworkng.

Related Issues (14)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.