我的世界服务器关闭现有连接怎么办
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的世界服务器关闭现有连接怎么办相关的知识,希望对你有一定的参考价值。
问题如上,配图:
给你个思路 只服务器端用数组保存链接 也就是在服务器端写日志 \r\n链接断开了 就用数组比较来获取断开的链接信息\r\n\r\n一般的链接断开 你只要在客户端代码里加上应用程序关闭时发送报文到你的服务器端 报文你自己定就好了 这样就能正常得到关闭的链接的信息。\r\n\r\n强制关闭的话就用timer 隔段时间对比下 时间设长点 要不然浪费资源 这就是为什么强制关闭电脑后一些在线工具还显示在线 参考技术A 可能是腐竹累了,把服务器关了,也有可能是你家网络断了。追问服务器开着的,网络也是好的
追答可能是版本不谦和吧
现有连接被远程主机强行关闭
【中文标题】现有连接被远程主机强行关闭【英文标题】:An existing connection was forcibly closed by the remote host 【发布时间】:2011-11-04 08:05:04 【问题描述】:我需要从异步套接字服务器获取 UDP 数据报,但我的应用程序发生了异常:
问题出现在那里:
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
完整源代码:
class Program
static void Main(string[] args)
const int PORT = 30485;
IPAddress IP;
IPAddress.TryParse("92.56.23.87", out IP);
// This constructor arbitrarily assigns the local port number.
UdpClient udpClient = new UdpClient(PORT);
Socket receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
try
udpClient.Connect("92.56.23.87", PORT);
if (udpClient.Client.Connected)
Console.WriteLine("Connected.");
// Sends a message to the host to which you have connected.
Byte[] sendBytes = Encoding.ASCII.GetBytes("CONNECT");
udpClient.Send(sendBytes, sendBytes.Length);
//IPEndPoint object will allow us to read datagrams sent from any source.
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IP, PORT);
// Blocks until a message returns on this socket from a remote host.
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
string returnData = Encoding.ASCII.GetString(receiveBytes);
// Uses the IPEndPoint object to determine which of these two hosts responded.
Console.WriteLine("This is the message you received " + returnData.ToString());
Console.WriteLine("This message was sent from " + RemoteIpEndPoint.Address.ToString() + " on their port number " + RemoteIpEndPoint.Port.ToString());
udpClient.Close();
catch (Exception e)
Console.WriteLine(e.ToString());
例外:
Connected.
System.Net.Sockets.SocketException (0x80004005): An existing connection
was forcibly closed by the remote host at System.Net.Sockets.Socket.ReceiveFrom(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, EndPoint& remoteEP) at ystem.Net.Sockets.UdpClient.Receive(IPEndPoint& remoteEP) at ConsoleApplication7.Program.Main(String[] args) in c:\users\user\documents\visual studio 2010\Projects\ConsoleApplication7\ConsoleApplication7\Program.cs
可能是什么问题?
为了提供更多信息,我在这个页面上购买了私人袜子连接:http://rapidsocks.com/ 这个服务给了我一个真正不是代理的 IP 和端口列表.. 只是一个连接给我一个 proxyIP:proxyPort 来自服务器上的一个池作为响应......
如何使用 proxyIP:proxyPort 从服务器获得答案?
【问题讨论】:
好问题——也许你再告诉我们一点——异常是在哪里抛出的?您在控制台上看到任何“调试消息”吗?你能告诉我们一个测试运行吗? 请在 catch 块中进行 stackTrace 打印,看看异常抛出了哪一行。 另一边工作正常 - 是吗?你能检查一下吗? 这里抛出异常:Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);这是例外: ckoenig - 你的意思是在服务器端吗? 【参考方案1】:在 UDP 领域,发生这种情况的一种方式是,当您向主机发送 UDP 数据包时,远程主机在该端口上没有侦听器,并弹回 ICMP 主机不可达消息作为响应。
简单来说,这个异常告诉您没有进程在该端口上的远端侦听。
更新:您应该能够使用以下代码避免这种行为:
var udpClient = new UdpClient();
uint IOC_IN = 0x80000000;
uint IOC_VENDOR = 0x18000000;
uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12;
udpClient.Client.IOControl((int)SIO_UDP_CONNRESET, new byte[] Convert.ToByte(false) , null);
Microsoft 文章 263823 对此主题这么说:[截至 2019 年很难找到]
症状 在 Windows 2000 中,用户数据报协议 (UDP) 程序可能 不起作用,可能会生成 WSAECONNRESET 响应。
原因 如果使用 sendto 函数发送数据报会导致 “ICMP 端口不可达”响应和选择功能设置为 readfds,程序返回 1 并随后调用 recvfrom 函数不适用于 WSAECONNRESET (10054) 错误响应。在 Microsoft Windows NT 4.0,这种情况会导致选择功能 阻塞或超时。
解决方案 一个名为“SIO_UDP_CONNRESET”的新套接字 IOCTL 已被 在 Windows 2000 中引入。使用此 IOCTL 时,程序必须 专门为Windows 2000重写以获得原始 Windows NT 4.0 行为。 Windows NT 4.0、Microsoft Windows 95 和 Microsoft Windows 98 不支持这个新的 IOCTL。此外 要重写您的应用程序,您将需要引用的修补程序 在这篇文章的后面。
【讨论】:
对我来说,这解决了在 Send() 将数据报发送到没有侦听器的套接字后 Receive() 导致异常的问题。我可以在没有侦听器的情况下发送()许多数据报而不会出错,但是 Receive() 将不再起作用。非常模糊的错误行为。这个解决方案同样含糊不清,但它帮助很大! +1 当现场设备突然更改 IP 地址而 UDP 数据包未完成时出现此错误。这解决了它。 @uingtea 显示的 IOCTL 不应直接导致高 CPU,它应该被调用并立即返回。如果您发现 CPU 问题,您可能需要检查您的代码是否存在高频发送循环。 没关系,这是我的代码中的另一个错误。【参考方案2】:这确实是一个通用的错误消息,可能意味着任何事情。是时候让低级别的网络流量嗅探器过滤实际出了什么问题了。在具有良好日志记录的服务器上添加额外的错误处理 try catch 块始终是一个不错的起点。
【讨论】:
这是一个带有代理服务的服务器,它是私有的,任何如何获取 IP:Port 的信息都写在 rfc1928 中 CONNECT 在对 CONNECT 的回复中,BND.PORT 包含服务器分配用于连接目标主机的端口号,而 BND.ADDR 包含关联的 IP 地址。提供的 BND.ADDR 通常与客户端用于访问 SOCKS 服务器的 IP 地址不同,因为此类服务器通常是多宿主的。预计 SOCKS 服务器将使用 DST.ADDR 和 DST.PORT,以及客户端源地址和端口来评估 CONNECT 请求。 服务器或代理是否有异常? 我不知道,对我来说是黑盒服务器..服务器的支持给我一个PHP代码示例: 为什么这被标记为答案?下面还有另一个答案,可以更详细地了解这个特定问题。以上是关于我的世界服务器关闭现有连接怎么办的主要内容,如果未能解决你的问题,请参考以下文章