我遇到了一个奇怪的问题,需要别人的帮助。我有一个程序作为代理链的一部分。它从一件事物中获取数据并将其发送给另一件物品。我遇到的唯一问题是receive方法没有任何用处。它冻结在那里。我的节目:
假设我们在链中有四个节点: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
这些都是同时开放的。
答案 0 :(得分:2)
客户端和服务器都在开始时调用Receive
。因此,客户端和服务器都将阻塞,直到他们可以返回至少一个字节,或报告EOF。由于两者都在等待传入数据,因此实际上都没有发送任何东西。所以:僵局。
另外:对Receive
的两次调用都无法捕获告诉您读取了多少数据的返回值 - 这是一个很大的错误。特别是,如果你甚至不能保证你拥有完整数量的字符,就不能使用多字节编码(如UTF-8)进行解码 - 从技术上讲,你可以拥有一个二分之一和三分之一的字符。 50个字符序列。