QTcpSocket真的是全双工吗?

时间:2015-01-16 15:46:18

标签: c++ multithreading qt sockets

BSD流套接字是全双工的,这意味着两个连接方可以同时发送/接收。

QTcpSocket(qt套接字实现)具有异步支持,非阻塞模式,但只能属于一个线程,请参阅qt docs

  

事件驱动对象只能在单个线程中使用。   具体而言,这适用于计时器机制和网络   模块。

假设我想要一个transmit / tx线程和一个单独的receive / rx线程来使用相同的套接字并同时发送/接收数据。

根据我的理解,这可以做到'通过qt信号/插槽,但套接字线程永远不会真正同时执行send()和receive()。它只运行事件循环,它将以串行方式执行此操作,并在发送/接收完成时发出信号。

是的,我的rx和tx线程可以同时工作并通过qt插槽处理通知,但套接字本身从未真正用于全双工模式。

这样说是否正确:仅考虑一个端点,在套接字线程中,其send()和receive()调用始终是串行的,从不同时进行? (因为事件循环线程只是一个线程)

1 个答案:

答案 0 :(得分:5)

  

根据我的理解,这可以做到'通过qt信号/插槽,但是   套接字线程永远不会真正执行send()和receive()   同时。它只运行事件循环,它将在a中执行此操作   串行时尚并在发送/接收完成后发出信号。

是的,但请记住,内核会缓冲传入和传出的数据,而QTCPSocket会将套接字设置为非阻塞,因此send()和recv()调用始终立即返回,并且永远不会阻塞事件循环。这意味着发送和接收数据的实际过程将同时发生(在内核内),即使(或多或少的瞬时)send()和recv()技术上没有。 (*)

  

是的,我的rx和tx线程可以同时工作并处理   通过qt插槽发送通知,但套接字本身从未真正使用过   在全双工模式下。这是对的吗?

这是不对的 - 套接字的数据流可以(并且确实)同时在网络上双向流动,因此套接字确实是全双工的。无论您使用的是单线程还是多线程,都会出现全双工功能。

(*)您可以使用单线程Qt程序对此进行测试,该程序使用QTCPSocket发送或接收数据,只需在大量数据传输期间断开计算机的以太网电缆即可。如果QTCPSocket的send()或recv()调用阻塞直到完成,那将阻止GUI线程并导致GUI无响应,直到您重新连接电缆(或直到TCP连接在几分钟后超时)