【问题标题】:C# Sockets Receive Method Does not Receive DataC# Sockets Receive 方法不接收数据
【发布时间】:2013-06-25 22:03:28
【问题描述】:

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

假设链中有四个节点: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

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

【问题讨论】:

    标签: c# sockets proxy


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的快速回复!我可以设置 Blocking = false 吗?
    • @user1951033 没有; Receive 基本上是一个阻塞调用——它阻塞直到它可以返回一个 EOF 或至少一个字节(假设超时不在播放,这不是一个好主意)。现在,执行 BeginReceive 或 ReceiveAsync 可能有意义。
    猜你喜欢
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 2011-08-06
    • 2013-02-15
    • 2014-03-31
    相关资源
    最近更新 更多