C#套接字的接收方法无法接收数据

3
我遇到了一个奇怪的问题,需要有人帮助。我有一个程序作为代理链的一部分。它接收来自一个地方的数据并将其发送到另一个地方。唯一的问题是,我的接收方法不接收任何东西,只是在那里冻结了。我的程序:
假设我们在链中有四个节点:A、B、C 和 D。
A 是一个 Web 浏览器。
B 是我的 C# 程序。
C 是我的 C# 客户端。
D 是一个网站。
B 听取 C 和 A 的内容。非常奇怪,但这就是我需要的配置方式。如何让这该死的程序工作?我已经编写了大量的代码,但出于某种原因,C 无法从 B 接收任何内容。有人能帮帮我吗?
我已经打开了所有端口,我的防火墙对 B 和 C 都关闭了。A 和 B 都在我的本地机器上运行。以下是一些 IP:
A 连接到 127.0.0.1:3056
B 听取 127.0.0.1:3056 和 IPAddress.Any:3055
C 连接到 MY_IP_ADDRESS:3055,并连接到 B 告诉它的任何地方
其中 MY_IP_ADDRESS 是从 whatismyip.com 获取的全局 IP 地址。
为什么 C 收不到任何内容?以下是一些相关代码:
客户端 (C):
Socket reqSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ip = new IPEndPoint(IPAddress.Parse("MY_IP_ADDRESS"), 3055);
reqSocket.Connect(ip);
byte[] ReqData = new byte[8192];
MessageBox.Show("BYTE"); // This runs, (click OK)
reqSocket.Receive(ReqData);
String ReqString = Encoding.UTF8.GetString(ReqData);
MessageBox.Show(ReqString); // This does not

服务器(B):

TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 3056);
listener.Start();
Socket Localhost = listener.AcceptSocket();
listener.Stop();
TcpListener listener2 = new TcpListener(IPAddress.Any, 3055);
listener2.Start(50);
Socket toSocket = listener2.AcceptSocket();
listener2.Stop();
byte[] buf = new byte[8192];
Localhost.Receive(buf);
toSocket.Send(buf);
MessageBox.Show("Sent!"); // This runs

这两个确实同时开放。

1个回答

3

在开始时,客户端和服务器都会调用 Receive。因此,客户端和服务器都将阻塞,直到它们可以返回至少一个字节或报告EOF为止。由于两者都在等待传入数据,因此实际上都没有时间发送任何内容。因此:死锁。

此外:对 Receive 的两个调用均未捕获返回值,该返回值“告诉您读取了多少数据”-这是一个大错误。特别是,如果您甚至不能保证拥有完整的字符数,则无法使用多字节编码(如UTF-8)进行解码-从50个字符序列中,您技术上可能会有两个和三分之一的字符。


谢谢您的快速回复!我可以将Blocking设置为false吗? - QuackQuack
@user1951033 不是的;Receive 基本上是一个阻塞调用 - 它会一直阻塞,直到它可以返回 EOF 或至少一个字节(假设没有超时,并且这不是一个好主意)。现在,使用 BeginReceive 或 ReceiveAsync 可能是有意义的。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接