3

我有一个奇怪的问题,需要别人的帮助。我有一个作为代理链一部分的程序。它从一件事中获取数据并将其发送到另一件事。我遇到的唯一问题是接收方法不接受任何内容。它只是在那里冻结。我的程序:

假设我们在链中有四个节点:A、B、C 和 D。

A 是网络浏览器

B 是我的 C# 程序

C 是我的 C# 客户端

D是一个网站

B 正在监听C 和 A。我知道很奇怪,但这就是我需要它的配置方式。我怎样才能让这个该死的程序工作?我已经设置了大量的代码,但由于某种原因,C 没有从 B 接收任何东西。C 可以连接到 B,但 C 不会收到任何东西。谁能帮我?

我打开了所有端口,B 和 C 的防火墙都关闭了。A 和 B 都在我的本地计算机上运行。给你一些IP:

A 连接到 127.0.0.1:3056

B 监听 127.0.0.1:3056 和 B 监听 IPAddress.Any:3055

C 连接到 MY_IP_ADDRESS:3055 并且 C 连接到 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

这两个确实是同时开放的。

4

1 回答 1

3

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

另外:两次调用都Receive未能捕获返回值,该值告诉您读取了多少数据- 这是一个很大的错误。特别是,如果你甚至不能保证你有完整数量的字符,你就不能使用多字节编码(如 UTF-8)进行解码——从技术上讲,你可以有两个又三分之一的字符来自50 个字符序列。

于 2013-06-25T22:11:32.177 回答