Laden...

IP-Endpoint an Socket binden

Erstellt von TBMSam vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.564 Views
T
TBMSam Themenstarter:in
9 Beiträge seit 2018
vor 5 Jahren
IP-Endpoint an Socket binden

Hallo zusammen,

Ein Server in meinem lokalen Netz sendet alle 5 Sekunden einen 120 Byte langen UDP-Broadcast.

Daher versuche ich nun, einen Sockel aufzusetzen, um diesen Broadcast abzufangen und auszuwerten:


IPAddress ip = IPAddress.Parse("192.168.127.162");
IPEndPoint ipe = new IPEndPoint(ip, 55555);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
{
    ReceiveBufferSize = 120 
};
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 30);
socket.Bind(ipe);

Meine lokalen cmd -> /ipconfig-Einstellungen sind folgendermaßen:

Bild entfernt, siehe unten - Coffeebean

Leider wirft er mir in der Zeile "socket.Bind(ipe);" folgende Exception:

Fehlermeldung:
System.Net.Sockets.SocketException: The requested address is not valid in this context

Kann sich irgendjemand erklären was das Problem sein könnte? Oder mir helfen, wie ich diesen Broadcast abfangen kann?

Wäre wirklich sehr verbunden.

Beste Grüße

3.170 Beiträge seit 2006
vor 5 Jahren

Hallo,

Socket.Bind will Deine lokale Adresse haben (oder Du könntest IPAddress.Any nehmen).
Die Adresse der Gegenstelle bekommst Du dann mit, wenn Du den Broadcast empfängst.

Beachte aber auch, dass Deine lokale IP (192.168.200.231/255.255.255.0) in einem anderen Subnetz liegt, als die IP, die Du in Deinem Code verwendest (also vermutlich die Server-IP).

Des weiteren würde ich Dir empfehlen, statt Socket den UdpClient zu verwenden.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

F
10.010 Beiträge seit 2004
vor 5 Jahren

Deine IP ist .231 und du versuchst für die IP .162 einen Bind zu machen?
Du solltest mal an den Grundlagen arbeiten.

Du machst für deine Adresse einen Socket auf und musst ggf überprüfen ob der Sender eine bestimmte Adresse hat.

T
TBMSam Themenstarter:in
9 Beiträge seit 2018
vor 5 Jahren

Danke schonmal für eure Antworten.

@FZelle Oh man sorry ich Trottel hab das falsche Bild eingebunden.

Also die im Code angegebene IP ist sowohl die meines Rechners als auch die dessens, auf dem der Broadcast-Dienst läuft. Macht also keinen Unterschied.

Werde jetzt mal versuchen, ob ich den Broadcast per UdpClient empfangen kann und melde mich dann nochmals. Denke halt das der Broadcast auch per Socket verschickt wird, habe folgenden Code als Auszug eines bereits funktionieren Receivers bekommen:

        private IPEndPoint ipendpoint;
        private Socket socket;
        private byte[] broadcastdata = null;

        sealed protected override async Task<AsyncTaskState> DoInitialize()
        {
            var result = AsyncTaskState.CancelTask;

            try
            {
                socket = new Socket(AddressFamily, SocketType, ProtocolType)
                {
                    ReceiveBufferSize = 100 * TaskSettings.Length
                };
                socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, TaskSettings.TimeOut);
                ipendpoint = new IPEndPoint(TaskSettings.IPAddress, TaskSettings.Port);
                socket.Bind(ipendpoint);

                result = AsyncTaskState.NoError;
            }
            catch
            {
                result = AsyncTaskState.CancelTask;
            }

            if (result == AsyncTaskState.NoError) broadcastdata = new byte[TaskSettings.Length];

            return await CancellationRequest(result);
        }


        sealed protected override async Task<AsyncTaskState> DoExecute()
        {
            if (socket.Available <= 0) return await CancellationRequest(AsyncTaskState.NoResult);

            var result = AsyncTaskState.NoResult;

            try
            {
                var ep = (EndPoint)ipendpoint;
                var received = socket.ReceiveFrom(broadcastdata, ref ep);
                result = ((received == TaskSettings.Length) && (InternalDetect(broadcastdata))
                    ? AsyncTaskState.HandleResult
                    : AsyncTaskState.NoResult);

                if (result == AsyncTaskState.HandleResult)
                {
                    TaskResult.Available = socket.Available;
                    TaskResult.BroadcastData = broadcastdata;
                    TaskResult.IPAddress = ((IPEndPoint)ep).Address.ToString();
                }
            }
            catch
            {
                result = AsyncTaskState.NoResult;
            }

            return await CancellationRequest(result);
        }