SocketException 现有连接被远程主机强制关闭

2024-03-14

我决定研究一下网络消息传递等,我的第一个调用端口是 UDP。

我遇到的问题是当我尝试发送消息时。我试图访问特定端口上的 IP,但应用程序出现错误

“SocketException 现有连接被远程主机强制关闭”。

这是代码。

    User ME = new User();
    UdpClient MyUDPClient;

    private void Form1_Load(object sender, EventArgs e)
    {
        ME.Username = Environment.UserName;
    }

    private void StartUDP_Click(object sender, EventArgs e)
    {
        CreateUDPClient();
    }

    private void CreateUDPClient()
    {
        IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
        foreach (IPAddress ip in host.AddressList)
        {
            if (ip.AddressFamily == AddressFamily.InterNetwork)
            {
                int Port = int.Parse(txt_Port.Text);
                ME.UserIP = new IPEndPoint(ip, Port);
                break;
            }
        }

        MyUDPClient = new UdpClient(ME.UserIP);
        UDPListening();
    }


    public void UDPListening()
    {
        MyUDPClient.BeginReceive(ReceiveMessage, new object());
    }

    private void ReceiveMessage(IAsyncResult IAR)
    {
        byte[] B = MyUDPClient.EndReceive(IAR, ref ME.UserIP);
        ProcessMSG(Encoding.ASCII.GetString(B));
        UDPListening();
    }

    delegate void MessageDelegate(String MSG);

    public void ProcessMSG(String M)
    {
        if (this.lbl_Messages.InvokeRequired)
        {
            MessageDelegate Del = new MessageDelegate(ProcessMSG);
            this.Invoke(Del, M);
        }
        else
        {
            lbl_Messages.Text = M;
        }
    }



   //Send Data to Another version of this program elsewhere.

    private void btn_SendtoTarget_Click(object sender, EventArgs e)
    {
        IPEndPoint TargetIP = new IPEndPoint(IPAddress.Parse(txt_Send2IP.Text),int.Parse(txt_Send2Port.Text));
        byte[] Message = Encoding.ASCII.GetBytes("TEST TEST TEST");

        MyUDPClient.Send(Message, Message.Length, TargetIP);
    }


}

谢谢您的帮助。

不确定这是否有帮助,但是......

应用程序正在设置为侦听的计算机上运行,​​地址为 192.168.0.25:5555

Send 正在尝试发送到机器 192.168.0.50:10001

T

通过进一步阅读,我认为我的具体问题是 UDPclient 对象的创建。它已创建,然后正在侦听 IP 192.168.0.25:5555。当我尝试发送消息时,我尝试使用相同的 UDPClient 但发送到新的 IP。我感觉这不是正确的程序,因此它试图关闭前一个程序???我确信有人可以证实这一点。因此,这对我来说,要拥有有效的 UDP 网络(向上和向下),我需要有一个 UDP 客户端接收和第二个 UDP 才能发送(这对于我想要命中的每个目标地址都是动态的)。再说一次,这都是猜测工作,如果我有这个,我希望有人能提供一些指示。


以上几个问题。

  1. 不要使用ME在 C# 中,它是this. Me是VB。如果使用 C#,上面的代码将无法编译,因为您遗漏了User()您定义为的类ME。我不知道为什么你认为你需要它,因为它似乎包含的是UserIP and UserName。 IP 是Socket,所以如果你需要的话,你应该使用它:
    IPAddress ip = IPAddress.Parse(socket.RemoteEndPoint);
    And UserName可以成为全局字符串变量 - 不必是类的一部分。
    也许我很挑剔,但我没有看到哪里需要在User()对我来说,试图破译代码,只是把事情搞砸了。
  2. 始终定义您的Socket,连接到它,然后做你的.Send()。您错过了按钮点击中的前两个步骤 - 您只需执行您的操作即可.Send(). UdpClient不是一个Socket,我认为最好这样做Socket并稍后定义您的连接类型。我认为你可能是对的,你正在努力做你的事情.Send()使用UdpClient你定义为你的听众。不要使用同一个对象来发送和收听!通常您会这样做,但每个事件都有 2 个不同的地址和端口。
  3. 不要使用foreach在你的CreateUDPClient()函数来获取你的IPAddress分配给你的IPEndPoint。你已经知道你的IP了。直接赋值即可。这是浪费处理时间。

    IPAddress ip = IPAddress.Parse("192.168.0.25");
    IPEndPoint endPoint = new IPEndPoint(ip, port);
    

如果您只有主机名,您会这样做:

    string hostName = "MyComputerName";
    int port = 5555;   // or int.Parse(txt_Port.Text);   ???
    IPHostEntry hostEntry = Dns.GetHostAddresses(hostName);
    IPEndPoint endPoint = new IPEndPoint(hostEntry[0], port);

不要使用Dns.GetHostEntry()-- 如果该名称没有反向查找 (PTR) 记录,则会失败。使用Dns.GetHostAddresses()。我不知道为什么你认为你需要循环,除非你有与你提供的相同主机名的 IPv6 地址。如果没有,只需使用[0]- 如果不使用 IPv6,它应该是您将使用的第一个也是唯一一个返回的 IP。但同样,由于您已经拥有 IP,只需将其插入即可 - 无需进行查找。它可以帮助你消除Dns.GetHostName(),也 - 只需使用192.168.0.25.

供您参考,MSDN 在这里提供了同步套接字发送/接收的过程:https://msdn.microsoft.com/en-us/library/kb5kfec7(v=vs.110).aspx https://msdn.microsoft.com/en-us/library/kb5kfec7(v=vs.110).aspx

以及异步套接字发送/接收:
http://msdn.microsoft.com/en-us/library/bew39x2a(v=vs.110).aspx http://msdn.microsoft.com/en-us/library/bew39x2a(v=vs.110).aspx

因为我鄙视仅链接的答案,并且您似乎通过使用混合这两种方法Send() and EndReceive(),分别到上面的链接,我将尽力简洁地描述其内容并帮助修复您的代码:

基本上他们说使用StateObject类,而不是全局变量MyUDPClient你有:

public class StateObject
{
    public byte[] buffer = new byte[1024];
    public Socket workSocket; 
    public StringBuilder sb = new StringBuilder();
}

您将创建一个套接字并将其添加到其中。缓冲区是一种告诉Receive() or EndReceive()您想要一次从响应中读回的块的大小,以及sb将作为响应的占位符。

看来你在这里发生了很多事情:SendtoTarget_Click从表单和你的听众中进行一次性测试。你的SendtoTarget按钮进行同步发送,您的StartUDP_Click()进行异步接收。

你会改变你的SendtoTarget_Click()事件是这样的(其中以前从未定义过您的套接字,并且您必须在发送之前连接到它):

private void btn_SendtoTarget_Click(object sender, EventArgs e)
{
    IPEndPoint TargetIP = new IPEndPoint(IPAddress.Parse(txt_Send2IP.Text),int.Parse(txt_Send2Port.Text));
    byte[] Message = Encoding.ASCII.GetBytes("TEST TEST TEST");

    // Create a UDP socket.  
    Socket sender = new Socket(AddressFamily.InterNetwork,  
        SocketType.Stream, ProtocolType.Udp);  

    try 
    {            
        // Connect to the remote endpoint.
        sender.Connect(TargetIP);  

        // Send message -- already contains the endpoint so no need to 
        // specify again
        sender.Send(Message, 0, Message.Length, SocketFlags.None);

        sender.Close();
    }
    catch (Exception)
    {
       // do something here...
    }
}

对于你的听众,你可以这样做:

private void CreateUDPClient()
{
    IPEndPoint TargetIP = new IPEndPoint(IPAddress.Parse("192.168.0.25"), 5555);

    // Create a UDP socket.  
    Socket receiver = new Socket(AddressFamily.InterNetwork,  
            SocketType.Stream, ProtocolType.Udp);  

    try {  

        // Create the state object.  
        StateObject state = new StateObject();  
        state.workSocket = receiver;  

        // Begin receiving the data from the remote device.  
        receiver.BeginReceive(state.buffer, 0, 256, 0,  
            new AsyncCallback(ReceiveMessage), state);  

    } catch (Exception e) {  
        Console.WriteLine(e.ToString());  
    }  
}

你的函数叫做ReceiveMessage(), 做这个:

private void ReceiveMessage(IAsyncResult IAR)
{
    string response = String.Empty;
    try {  

        // Retrieve the state object and the client socket   
        // from the asynchronous state object.  
        StateObject state = (StateObject) IAR.AsyncState;  
        Socket client = state.workSocket;  

        // Read data from the remote device.  
        int bytesRead = client.EndReceive(IAR);  

        if (bytesRead > 0) {  
            // There might be more data, so store the data received so far.  
            state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));  

            // Get the rest of the data.  
            client.BeginReceive(state.buffer, 0, 256, 0,  
                new AsyncCallback(ReceiveCallback), state);  
        } else {  
            // All the data has arrived; put it in response.  
            if (state.sb.Length > 1) {  
                response = state.sb.ToString();  
            }  
            // Signal that all bytes have been received.  
            client.Close();  
        }  
        ProcessMSG(response);
        CreateUDPClient();  // personally, I would re-create than calling BeginReceive directly

    } catch (Exception e) {  
        Console.WriteLine(e.ToString());  
    }  
}

我尽力以一种可行的方式将您的代码与 MSDN 集成。您也许可以通过将该套接字分配给StateObject并打电话BeginReceive()再次强调 - 不确定。但不要重复使用UdpClient像这样的对象。使用StateObject像 MSDN 上的类一样,并且仅将其用作您的侦听器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SocketException 现有连接被远程主机强制关闭 的相关文章

  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 回发后刷新时提示确认表单重新提交。我做错了什么?

    我有一个以空白 默认状态启动的仪表板 我让用户能够将保存的状态加载到仪表板中 当他们单击 应用 按钮时 我运行以下代码 function CloseAndSave var radUpload find radUpload1ID var in
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 使用 C# 读取 Soap 消息

  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • 使用 .NET Process.Start 运行时挂起进程 - 出了什么问题?

    我在 svn exe 周围编写了一个快速而肮脏的包装器来检索一些内容并对其执行某些操作 但对于某些输入 它偶尔会重复挂起并且无法完成 例如 一个调用是 svn list svn list http myserver 84 svn Docum
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com
  • 当我使用 OpenSSL1.1.0g 根据固定的 p 和 g 值创建 Diffie Hellman 密钥协议密钥时,应该执行哪些检查?

    您好 我尝试通过这段代码使用修复 p 和 g 参数来制作 Diffie Hellman Keysanswer https stackoverflow com a 54538811 4706711 include

随机推荐