如何使用Qt阻止tcp套接字?

古奇

我一起工作QTcpSocket我需要对套接字进行任何写/读调用以使其同步(阻塞)。

我知道有waitForReadyRead()waitForBytesWritten(),但是Qt文档中标记了这两种方法,因为它们在Windows下可能会随机失败。我不能为此。

阻塞读取是最重要的(因为读取总是在向另一个对等方写入命令之后进行的,所以我知道如果数据到达另一个对等方,它将回答)。

我尝试了2种方法。

第一的:

QByteArray readBytes(qint64 count)
{
    int sleepIterations = 0;
    QByteArray resultBytes;
    while (resultBytes.size() < count && sleepIterations < 100)
    {
        if (socket->bytesAvailable() == 0)
        {
            sleepIterations++;
            QThread::msleep(100);
            QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
            continue;
        }

        resultBytes += socket->read(qMin(count, socket->bytesAvailable()));
    }
    return resultBytes;
}

这应该等待字节可用于在套接字上读取,同时处理事件循环,因此套接字正在做必要的内部工作。

不幸的是-由于我未知的原因-bytesAvailable()有时返回正确的字节数,但有时却永远不会返回大于0的任何值。

我实际上知道要读取数据,因为它曾经与第二种方法一起工作(但它有其自身的问题)。

第二:

我有一种信号“阻止程序”,它阻止当前上下文并处理事件循环,直到发出某些信号为止。这是“阻止者”:

SignalWait.h:

class SignalWait : public QObject
{
        Q_OBJECT

    public:
        SignalWait(QObject *object, const char *signal);

        bool wait(int msTimeout);

    private:
        bool called = false;

    private slots:
        void handleSignal();
};

SignalWait.cpp:

SignalWait::SignalWait(QObject* object, const char* signal) :
    QObject()
{
    connect(object, signal, this, SLOT(handleSignal()));
}

bool SignalWait::wait(int msTimeout)
{
    QTime timer(0, 0, 0, msTimeout);
    timer.start();
    while (!called && timer.elapsed() < msTimeout)
        QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);

    return called;
}

void SignalWait::handleSignal()
{
    called = true;
}

然后我像这样使用它:

SignalWait signalWait(socket, SIGNAL(readyRead()));
// ...
// socket->write(...);
// ...
if (!signalWait.wait(30000))
{
    // error
    return;
}
bytes = socket->read(size);

这种方法似乎效果更好,但有时也会失败。我不知道为什么 就像readyRead()信号从未发出过,并且SignalWait一直等待直到超时。

我没主意了。处理它的正确方法是什么?

内贾特

我建议使用异步方法,但是如果您真的想使用同步方法,那么更好的方法是使用本地事件循环:

QTimer timer;
timer.setSingleShot(true);
QEventLoop loop;
loop.connect(socket, SIGNAL(readyRead()), SLOT(quit())); 
connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));

while (resultBytes.size() < count)
{
    timer.start(msTimeout);
    loop.exec();

    if(timer.isActive())
        resultBytes += socket->read(qMin(count, socket->bytesAvailable()));
    else
        break;
}

在这里,它一直等到count读取字节或超时为止

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

TCP阻止套接字-在不同数据包中接收少量字节的可能性

来自分类Dev

Qt TCP / IP套接字连接检查

来自分类Dev

如何检查是否使用Python中的TCP套接字接收了所有数据

来自分类Dev

通过TCP套接字实时传输Qt流音频

来自分类Dev

如何找到TCP套接字的索引节点?

来自分类Dev

如何对自定义套接字TCP协议使用证书身份验证?

来自分类Dev

TCP套接字函数recv()阻止程序

来自分类Dev

使用Linux套接字检测TCP重置

来自分类Dev

如何使用AT命令可靠地拆除和重新连接TCP / IP套接字

来自分类Dev

如何使用gen_tcp在Elixir中的活动套接字上检测TCP超时?

来自分类Dev

如何保持TCP套接字打开?

来自分类Dev

如何使用ZeroMQ通过TCP套接字发送PNG图像?

来自分类Dev

QT TCP套接字连接异常。实参太多

来自分类Dev

TCP套接字-InvalidOperationException

来自分类Dev

如何使TCP套接字超时

来自分类Dev

TCP阻止套接字-在不同数据包中接收少量字节的可能性

来自分类Dev

如何使用TCP / IP套接字发送特殊字符?

来自分类Dev

Rails TCP套接字

来自分类Dev

如何检查是否使用Python中的TCP套接字接收了所有数据

来自分类Dev

如何使用C#套接字TCP连接调度发送/接收数据

来自分类Dev

使用从TCP套接字[python]接收的数据

来自分类Dev

如何使用PHP创建到同一主机的多个持久套接字连接TCP / IP

来自分类Dev

套接字TCP连接

来自分类Dev

如何使用gen_tcp在Elixir中的活动套接字上检测TCP超时?

来自分类Dev

如何在没有套接字的Android中使用TCP客户端?

来自分类Dev

HTTP 服务器如何使用 tcp 原始套接字检测和处理非 http 消息

来自分类Dev

如何在 C 中使用 TCP 套接字发送 size_t 变量?

来自分类Dev

我如何使用 Ip 标志和 Tcp 控制标志发送 TCP 原始套接字

来自分类Dev

如何对共享相同地址 (URL) 的 URL 使用不同的 TCP 套接字连接

Related 相关文章

  1. 1

    TCP阻止套接字-在不同数据包中接收少量字节的可能性

  2. 2

    Qt TCP / IP套接字连接检查

  3. 3

    如何检查是否使用Python中的TCP套接字接收了所有数据

  4. 4

    通过TCP套接字实时传输Qt流音频

  5. 5

    如何找到TCP套接字的索引节点?

  6. 6

    如何对自定义套接字TCP协议使用证书身份验证?

  7. 7

    TCP套接字函数recv()阻止程序

  8. 8

    使用Linux套接字检测TCP重置

  9. 9

    如何使用AT命令可靠地拆除和重新连接TCP / IP套接字

  10. 10

    如何使用gen_tcp在Elixir中的活动套接字上检测TCP超时?

  11. 11

    如何保持TCP套接字打开?

  12. 12

    如何使用ZeroMQ通过TCP套接字发送PNG图像?

  13. 13

    QT TCP套接字连接异常。实参太多

  14. 14

    TCP套接字-InvalidOperationException

  15. 15

    如何使TCP套接字超时

  16. 16

    TCP阻止套接字-在不同数据包中接收少量字节的可能性

  17. 17

    如何使用TCP / IP套接字发送特殊字符?

  18. 18

    Rails TCP套接字

  19. 19

    如何检查是否使用Python中的TCP套接字接收了所有数据

  20. 20

    如何使用C#套接字TCP连接调度发送/接收数据

  21. 21

    使用从TCP套接字[python]接收的数据

  22. 22

    如何使用PHP创建到同一主机的多个持久套接字连接TCP / IP

  23. 23

    套接字TCP连接

  24. 24

    如何使用gen_tcp在Elixir中的活动套接字上检测TCP超时?

  25. 25

    如何在没有套接字的Android中使用TCP客户端?

  26. 26

    HTTP 服务器如何使用 tcp 原始套接字检测和处理非 http 消息

  27. 27

    如何在 C 中使用 TCP 套接字发送 size_t 变量?

  28. 28

    我如何使用 Ip 标志和 Tcp 控制标志发送 TCP 原始套接字

  29. 29

    如何对共享相同地址 (URL) 的 URL 使用不同的 TCP 套接字连接

热门标签

归档