Socket Verbindung in C#

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren