BSD流套接字是全双工的,这意味着两个连接方可以同时发送/接收。
QTcpSocket(qt套接字实现)具有异步支持,非阻塞模式,但只能属于一个线程,请参阅qt docs。
事件驱动对象只能在单个线程中使用。 具体而言,这适用于计时器机制和网络 模块。
假设我想要一个transmit / tx线程和一个单独的receive / rx线程来使用相同的套接字并同时发送/接收数据。
根据我的理解,这可以做到'通过qt信号/插槽,但套接字线程永远不会真正同时执行send()和receive()。它只运行事件循环,它将以串行方式执行此操作,并在发送/接收完成时发出信号。
是的,我的rx和tx线程可以同时工作并通过qt插槽处理通知,但套接字本身从未真正用于全双工模式。
这样说是否正确:仅考虑一个端点,在套接字线程中,其send()和receive()调用始终是串行的,从不同时进行? (因为事件循环线程只是一个线程)
答案 0 :(得分:5)
根据我的理解,这可以做到'通过qt信号/插槽,但是 套接字线程永远不会真正执行send()和receive() 同时。它只运行事件循环,它将在a中执行此操作 串行时尚并在发送/接收完成后发出信号。
是的,但请记住,内核会缓冲传入和传出的数据,而QTCPSocket会将套接字设置为非阻塞,因此send()和recv()调用始终立即返回,并且永远不会阻塞事件循环。这意味着发送和接收数据的实际过程将同时发生(在内核内),即使(或多或少的瞬时)send()和recv()技术上没有。 (*)
是的,我的rx和tx线程可以同时工作并处理 通过qt插槽发送通知,但套接字本身从未真正使用过 在全双工模式下。这是对的吗?
这是不对的 - 套接字的数据流可以(并且确实)同时在网络上双向流动,因此套接字确实是全双工的。无论您使用的是单线程还是多线程,都会出现全双工功能。
(*)您可以使用单线程Qt程序对此进行测试,该程序使用QTCPSocket发送或接收数据,只需在大量数据传输期间断开计算机的以太网电缆即可。如果QTCPSocket的send()或recv()调用阻塞直到完成,那将阻止GUI线程并导致GUI无响应,直到您重新连接电缆(或直到TCP连接在几分钟后超时)