Anu*_*N C 8 c# sockets try-catch
我正在尝试开发多播接收器程序并完成套接字初始化,如下所示:
public void initializeThread()
{
statuscheckthread = new Thread(SetSocketOptions);
statuscheckthread.IsBackground = true;
}
private void Form1_Load(object sender, EventArgs e)
{
rxsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
iep = new IPEndPoint(IPAddress.Any, 9191);
rxsock.Bind(iep);
ep = (EndPoint)iep;
initializeThread();
statuscheckthread.Start();
}
public void SetSocketOptions()
{
initializeThread(); //re-initializes thread thus making it not alive
while (true)
{
if (NetworkInterface.GetIsNetworkAvailable())
{
bool sockOptnSet = false;
while (!sockOptnSet)
{
try
{
rxsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse("224.50.50.50")));
rxsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 64);
sockOptnSet = true;
}
catch
{
//Catch exception here
}
}
}
break; // Break out from loop once socket options are set
}
}
Run Code Online (Sandbox Code Playgroud)
当我的PC未连接到网络时,SetSocketOption方法抛出异常,即使连接了网络,我也无法接收数据,因为未设置套接字选项.
为了避免这种情况,我使用了一个在后台运行的线程来检查网络可用性,一旦网络可用,它就会设置套接字选项.
它在某些PC中正常工作,但在其他一些PC中,NetworkInterface.GetIsNetworkAvailable()
在网络连接之前返回true(在识别网络时).
因此,为了确保设置Socket选项,我使用了一个bool变量sockOptnSet
,该变量被设置为
true好像try块中的所有语句都被执行,如方法中所示public void SetSocketOptions()
这个程序在我试过的所有PC中都能正常工作,但我很怀疑我可以依靠多少工作.
我的问题是:
1)这是一个好习惯吗?
2)如果没有,可能导致的错误或问题是什么?我怎样才能以更好的方式实现它?
这是一个好的做法吗?
不,这不是一个好的做法。绝大多数异常,包括您的第一个异常,都属于令人烦恼的异常类别。软件应该可以工作,在测试时工作得很好,但在用户的机器上却不行。出现了问题,但您不知道问题出在哪里,而且对此您无能为力。试图让你的程序继续运行是没有用的,它无法完成它应该做的工作。就您而言,当没有网络时,套接字不可能接收数据。而且,正如您所发现的,试图解决问题只会带来更多问题。这很正常。
如果这是不好的做法,我怎样才能以更好的方式实施它?
你需要人类的帮助。用户必须设置机器才能提供有效的网络连接。这需要一个用户界面,你必须有一种方法告诉人们他需要做什么来解决你的问题。您可以根据需要使其变得复杂或简单。只需一条错误消息、Exception.Message 的逐字副本就足够了。为 AppDomain.CurrentDomain.UnhandledException 事件编写事件处理程序是一个非常好的(也是必需的)策略。Microsoft 花费了大量的精力来使异常消息尽可能清晰和有用,甚至以用户的母语为您本地化它们,您希望利用这一点。即使异常消息令人费解,对消息文本的快速 Google 查询也会返回数百个匹配结果。使用此事件处理程序后,您无需执行任何特殊操作。您的程序会自动终止,并且您的用户知道该怎么做。
你当然可以让它变得更复杂,你发现 SetSocketOption() 很容易在网络可用后立即失败,但当你等待足够长的时间时它就会工作。因此,这实际上是一个错误情况,您可以通过等待足够长的时间来解决。是否应该编写代码来处理这个问题需要您自己决定。当您对程序的行为方式有足够的经验时,您就可以编写它,而不是预先编写它。通常是程序用户反馈的结果。