Socket Verbindung in C#

Gast #3977800
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;
Gast #3983458
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.
Gast #3983665
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". ;))
Gast #3984861
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?
Gast #3984876
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
}
#3985114
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..
Gast #3985326
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);
Gast #3985342
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.