C# 套接字编程中的异常处理

C# 套接字编程中的异常处理,c#,exception-handling,C#,Exception Handling,当我的远程计算机未连接时,我收到一条错误消息。用这段代码我得到了错误 public partial class Form1 : Form { private void button1_Click(object sender, EventArgs e) { String text = textBox1.Text; UdpClient udpc = new UdpClient(text,8899); IPEndPoint ep = nu

当我的远程计算机未连接时,我收到一条错误消息。用这段代码我得到了错误

public partial class Form1 : Form
{
    private void button1_Click(object sender, EventArgs e)
    {
        String text = textBox1.Text;
        UdpClient udpc = new UdpClient(text,8899);
        IPEndPoint ep = null;

        while (true)
        {
            MessageBox.Show("Name: ");
            string name = "Connected";
            if (name == "") break;
            byte[] sdata = Encoding.ASCII.GetBytes(name);
            udpc.Send(sdata, sdata.Length);

            if (udpc.Receive(ref ep)==null)
            {
               MessageBox.Show("Host not found");               
            }
            else
            {                
                byte[] rdata = udpc.Receive(ref ep);
                string job = Encoding.ASCII.GetString(rdata);
                MessageBox.Show(job);
            }               
        }
    }

错误消息是,套接字异常未受影响。(远程主机强制关闭了现有连接)

您可以将无限循环包装在try-catch块中

if (udpc.Receive(ref ep)==null) 
看看它是否完成了。

将代码包装在

try
{
 while(true)
 {
   //your code
 } 
}
catch(Exception exception)
{
   //show exception.Message; 
}
finally{ //clean up}
并从这里开始获取有关SocketException的文档


如果异常未处理,请处理异常:

try
{

}
catch(SocketException se)
{

}
catch(Exception ex)
{
}

当程序访问外部资源(dbs、队列、文件系统、http连接、udp套接字等)时,始终建议使用
try…catch
块。

我假设您想知道为什么会发生这种情况,以及如何防止这种情况?你需要把问题弄清楚。我知道这很老了,但是用这种方法捕获所有异常可能会吞没你没有真正处理的异常。这将导致无提示故障和难以调试代码。总是显式地捕捉异常。@bodangly虽然我大体上同意,但我不认为它会导致无声的失败。您仍然可以告诉或记录引发的异常,并重新引发该异常。
    while (true)
    {
        MessageBox.Show("Name: ");
        string name = "Connected";
        if (name == "") break;
        byte[] sdata = Encoding.ASCII.GetBytes(name);

        try{
            udpc.Send(sdata, sdata.Length);
            byte[] rdata = udpc.Receive(ref ep);
            string job = Encoding.ASCII.GetString(rdata);
            MessageBox.Show(job);
        }
        catch(Exception ex)
        {
            MessaageBox.show(ex.toString());
        }
    }