Forum: PC-Programmierung Socket Verbindung in C#


von Anwender (Gast)


Lesenswert?

Hallo,

in C# habe ich folgendes Problem. Ich möchte mit SOCKET eine Verbindung 
zu einem anderen Rechner aufbauen. Alllerdings soll der 
USB-Ethernet-Adpater benutzt werden. Dieser hat die IP-Adresse: 
192.168.0.8.
Was müsste ich tun, damit ich den USB-Ethernet-Adpter mit der IP-Adresse 
verwenden kann?
1
pingSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);
2
            localEndPoint = new IPEndPoint(IPAddress.Parse(IP), port);
3
4
            pingSocket.Bind(localEndPoint);
5
6
            pingSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, pingTtl);
7
8
            receiveBuffer = new byte[Ipv4Header.Ipv4HeaderLength + IcmpHeader.IcmpHeaderLength + pingPayloadLength];
9
            responseEndPoint = new IPEndPoint(IPAddress.Any, 0);
10
            castResponseEndPoint = (EndPoint)responseEndPoint;

von bluppdidupp (Gast)


Lesenswert?

Falls gepingt werden soll - Pingen kann man auch einfacher:
https://msdn.microsoft.com/de-de/library/dcc2xffs(v=vs.110).aspx

von Anwender (Gast)


Lesenswert?

Guten Morgen, mit der Pink Klasse kann man natürlich auch pingen. 
Allerdings kann man die Sequenznummer vom ICMP-Protokoll nicht auslesen. 
Wenn dies trptzdem gehen sollte, wäre es für meinen Fall super.

von Halbaffe (Gast)


Lesenswert?

Anwender schrieb:
> Allerdings kann man die Sequenznummer vom ICMP-Protokoll nicht auslesen.
> Wenn dies trptzdem gehen sollte, wäre es für meinen Fall super.

Vielleicht hilft dir das hier weiter:

http://www.winsocketdotnetworkprogramming.com/clientserversocketnetworkcommunication8i.html

Ausschnitt aus dem Code (PingReceiveCallback):
/*Console.WriteLine("Icmp.Id = {0}; Icmp.Sequence = {1}",
                    icmpv4Header.Id,
                    icmpv4Header.Sequence
                    );*/

> Guten Morgen, mit der Pink Klasse kann man natürlich auch pingen.

"Pink Klasse" -> man findet die Sängering Pink gut. Du meinst sicher 
"Ping-Klasse". ;))

von Anwender (Gast)


Lesenswert?

Hallo,

danke für den Link. Diese Internetseite kenne ich bereits. Für meine 
Anwendung ist eine SOCKET Verbindung das richtige. Bei der Umsetzung hab 
ich allerdings noch Probleme. Es soll zum Beispiel alle 10ms ein Ping 
gesendet werden. Dabei müsste die Applikation feststellen können, ob ein 
Timeout aufgetreten ist oder nicht. Jetzt gibt es hierfür die 
Möglichkeit das ganze synchron oder asynchron zu realisieren. 
Wahrscheinlich ist asynchron die richtige Wahl. Wie müsste ich dies mit 
dem Timeout umsetzen?

von Anwender (Gast)


Lesenswert?

Mit der Ping-Klasse habe ich das so realisiert. Dies ist allerdings eine 
blockierende Variante.
1
PingReply reply = _objPing.Send("192.168.1.23", 1000, Encoding.ASCII.GetBytes(sPingData), _objOptions);
2
3
if (reply.Status == IPStatus.Success)
4
{
5
 ...
6
}
7
else if (reply.Status == IPStatus.TimedOut)
8
{
9
 ...
10
}

von Markus (Gast)


Lesenswert?

Anwender schrieb:
> Es soll zum Beispiel alle 10ms ein Ping
> gesendet werden.

Unter Windows? Ziemlich ambitioniert, würde ich sagen.

Grüße
Markus

von Anwender (Gast)


Lesenswert?

Mit der SendTo Methode von der SOCKET Klasse kann ich einen Ping 
absetzen. Nun möchte ich einen Timeout detektieren. Wie wird dies 
realisiert?

von Robert L. (lrlr)


Lesenswert?

Markus schrieb:
> Anwender schrieb:
>> Es soll zum Beispiel alle 10ms ein Ping
>> gesendet werden.
>
> Unter Windows? Ziemlich ambitioniert, würde ich sagen.
>
> Grüße
> Markus

ist das so?


ich hatte mal ein Problem, und um die Ursache zu finde, ein Programm 
geschrieben das UDP Pakete versendet, ich brauchte zwar nur 16ms und 
17ms Abstände, man kann aber alles einstellen bis runter zu 1ms (weniger 
hab ich nie probiert)

ich hatte mit der Genauigkeit (also dem Abstand der Pakete) nie ein 
gröberes Problem...
ich wüsste auch nicht warum..

von Anwender (Gast)


Lesenswert?

Wenn ich mit der SendTo Methode einen Ping versendet, wie müsste der 
Timeout programmiertechnisch behandelt werden?

von Peter II (Gast)


Lesenswert?

Anwender schrieb:
> Wenn ich mit der SendTo Methode einen Ping versendet, wie müsste der
> Timeout programmiertechnisch behandelt werden?

kannst du mal zeigen wie du mit SendTo einen Ping versendest?

von Anwender (Gast)


Lesenswert?

Das geht in C# mit SOCKET. Im ersten Paramter von der Methode SendTo 
wird das generierte Frame (byte[]) übergeben
1
pingSocket = new Socket(destEndPoint.AddressFamily, SocketType.Raw, ProtocolType.Icmp);

von Anwender (Gast)


Lesenswert?

Ich benötige eigentlich NUR ein Timeout Mechanismus. Wie mache ich sowas 
in C#????

von Peter II (Gast)


Lesenswert?

Anwender schrieb:
> Das geht in C# mit SOCKET. Im ersten Paramter von der Methode SendTo
> wird das generierte Frame (byte[]) übergeben
> pingSocket = new Socket(destEndPoint.AddressFamily, SocketType.Raw,
> ProtocolType.Icmp);

dort kann es keinen Timeout geben!!

Du sendest einfach ein RAW packet. Das ist wie wenn du jemand rufst und 
er nicht antwortet.

Du musst selber auf den Antwort warten und wenn sie nicht schnell genug 
kommt dann einen Timeout selber festlegen.

Warum  nimmst du nicht die fertig ping Klasse? Wenn dich das Blockieren 
stört, dann verwende Threads.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.