使用UdpClient发送数据时访问被拒绝

时间:2017-08-18 16:04:53

标签: c# .net macos mono

我正在尝试创建一个小型应用程序,它从Serial- / Com-Port读取数据,并使用端口15000将数据广播到我的网络。

在Windows和Linux(使用Mono)上一切正常但我在macOS上得到Socket Exception,并显示以下消息:Access denied

我尝试使用提升的权限运行我的应用程序:

  

sudo mono ./SerialMonitor.exe

但这也不起作用。

有没有办法摆脱这种异常?为什么它在Windows和Linux上没有任何问题?

这是我的代码:

using System;
using System.IO.Ports;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace SerialMonitor
{
    class MainClass
    {
        static SerialPort mSerial = new SerialPort();
        static String[] mSerialPorts;
        static UdpClient mNetwork;
        static IPEndPoint mIP;

        static String mData = "";

        public static void Main(string[] args)
        {
            mNetwork = new UdpClient();
            mIP = new IPEndPoint(IPAddress.Parse("192.168.1.255"), 15000);

            mSerialPorts = SerialPort.GetPortNames();

            Console.WriteLine("Select a serial port:");
            if (mSerialPorts.Length == 0)
            {
                Console.WriteLine("No serial ports available!");
                return;
            }
            for (int i = 0; i < mSerialPorts.Length; i++)
            {
                Console.WriteLine(i + 1 + ": " + mSerialPorts[i]);
            }
            Console.Write("Selection: ");
            int selection = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine("Selected port: " + mSerialPorts[selection - 1]);

            mSerial.PortName = mSerialPorts[selection - 1];
            mSerial.BaudRate = 9600;
            mSerial.NewLine = "\r\n";
            mSerial.Open();
            mSerial.DiscardInBuffer();

            Console.WriteLine("\nData:");

            while (true)
            {
                try
                {
                    MainClass.mData = mSerial.ReadLine();
                    Console.WriteLine(MainClass.mData);

                    byte[] bytes = Encoding.ASCII.GetBytes(MainClass.mData);
                    mNetwork.Send(bytes, bytes.Length, mIP);
                }
                catch(SocketException ex)
                {
                    Console.WriteLine("\nNETWORK ERROR: " + ex.Message);
                    Console.Read();
                    return;
                }
                catch (Exception ex)
                {
                    Console.WriteLine("\nERROR: " + ex.Message);
                    Console.Read();
                    return;
                }
            }
        }
    }
}

我正在使用Visual Studio Community 2017 for Mac

版本7.1(版本1297)

Mono 5.2.0.215(d15-3 / da80840)(64位)

项目配置:

.NET Framework 4.6.1

86

1 个答案:

答案 0 :(得分:2)

如果要通过本地子网(或一般广播)发送广播消息,则必须在套接字上启用广播:

mNetwork.EnableBroadcast = true;

参考:

https://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient(v=vs.110).aspx

http://answers.unity3d.com/questions/248494/socket-exception-access-denied.html