C#套接字接收方法不接收数据
本文关键字:数据 方法 套接字 | 更新日期: 2023-09-27 18:20:04
我遇到了一个奇怪的问题,需要别人的帮助。我有一个程序作为代理链的一部分。它接收来自一个事物的数据并将其发送到另一个事物。我遇到的唯一问题是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。任意:3055
C连接到MY_IP_ADDRESS:3055,C连接到B告诉它的任何位置
其中MY_IP_ADDRESS是我的全局IP地址,取自whatismyip.com
为什么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
这两者确实同时开放。
客户端和服务器一开始都在调用Receive
。因此,客户端和服务器都将被阻止,直到它们能够返回至少一个字节,或者报告EOF。由于两者都在等待传入的数据,所以实际上都没有时间发送任何东西。所以:僵局。
此外:对Receive
的两个调用都无法捕获返回值,会告诉您读取了多少数据-这是一个大错误。特别是,如果你甚至不能保证你有完整的字符数,你就不能用多字节编码(比如UTF-8)解码——从技术上讲,你可以从50个字符的序列中有两个和三分之一的字符。