【问题标题】:Windows socket write() is blocked by a read() unexpectedlyWindows 套接字 write() 被 read() 意外阻止
【发布时间】:2013-05-29 05:28:24
【问题描述】:

(这是以前asked 问题的更新转贴,使用我丢失了凭据的旧帐户发布)

我在写一个客户端-服务器程序,客户端是C++/winapi,服务器是C#/.net。

socket 是一个 AF_INET/ SOCK_STREAM,我在客户端使用 Readfile() 和 WriteFile() 进行 socket IO。

客户端有一个从服务器读取的循环(并且可能会阻塞调用线程 [表示 t1] ,这对我来说很好)。它还有另一个线程 [表示 t2] ,等待一个超时的事件对象。

如果达到超时(并且事件尚未被单选),t2 线程将在同一个套接字上写入(精确地按字节)。

我遇到的问题是,在 t1 上的读取返回之前,写入似乎不会返回(在某些合法的场景中,它永远不会发生),好像套接字不是全双工的。

我已经从头到尾检查过了,没有其他与线程相关的并发症。我实际上是从不同的机器上运行客户端,并使用wireshark 来嗅探流量。达到超时后,网络上什么都没有(无论我等待多长时间),直到我从服务器端写入一些数据(因此 t1 上的 read() 返回) - 就在那之后,write()客户端的最终传输。

【问题讨论】:

标签: windows multithreading sockets thread-safety winsock


【解决方案1】:

正如我在您之前的问题中所解释的,套接字全双工的。一个线程中的读取不会阻塞另一个线程中的写入,反之亦然。

【讨论】:

    猜你喜欢
    • 2015-01-10
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多