Windows套接字write()被read()意外阻止

时间:2013-05-29 05:28:24

标签: windows multithreading sockets thread-safety winsock

(这是以前asked问题的更新转贴,上贴有旧帐户,但我已丢失凭据)

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

socket是一个AF_INET / SOCK_STREAM,我在客户端使用Readfile()和WriteFile()作为套接字IO。

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

如果达到超时(并且尚未单独调用Event),t2线程将在同一个套接字上写(exacly on byte)。

我遇到的问题是,似乎写入不会返回,直到t1上的读取返回(在一些合法的scnerions中它永远不会发生),就像套接字不是全双工一样。

我已经检查过它,但是没有其他与线程相关的复制品。我实际上从不同的机器运行客户端,并使用wireshark来嗅流量。达到超时后,线路上什么都没有(无论我等多久),直到我从服务器端写了一些数据(所以t1上的read()返回) - 就在那之后,写()客户终于被传送了。

1 个答案:

答案 0 :(得分:0)

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