<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=SocketCAN</id>
	<title>SocketCAN - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=SocketCAN"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=SocketCAN&amp;action=history"/>
	<updated>2026-05-21T05:13:10Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=SocketCAN&amp;diff=2657661&amp;oldid=prev</id>
		<title>imported&gt;Joachim Schnitter am 12. April 2025 um 11:23 Uhr</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=SocketCAN&amp;diff=2657661&amp;oldid=prev"/>
		<updated>2025-04-12T11:23:35Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;SocketCAN&amp;#039;&amp;#039;&amp;#039; ist eine Sammlung von [[Controller Area Network|CAN]]-Treibern und einer Netzwerkschicht, beigestellt von der Konzernforschung der [[Volkswagen AG]] zum [[Linux (Kernel)|Linux-Kernel]] als [[Open Source]]. Sie ist auch bekannt als &amp;#039;&amp;#039;Low Level CAN Framework&amp;#039;&amp;#039; (LLCF).&lt;br /&gt;
&lt;br /&gt;
[[Datei:Socketcan.png|mini|Typisches Schichtenmodell der CAN-Kommunikation, mit SocketCAN (links) oder konventionell (rechts)]]&lt;br /&gt;
&lt;br /&gt;
Vorherrschende CAN-Treiber basieren auf dem Modell eines zeichenorientierten Gerätes (character device). Typischerweise erlauben diese Treiber für einen CAN-Controller nur das Senden und Empfangen. Die Implementierungen für diese Geräteklasse erlauben meist nur einem einzigen Prozess, auf das Gerät zuzugreifen, d.&amp;amp;nbsp;h. für alle anderen Prozesse ist diese serielle Schnittstelle blockiert. Darüber hinaus ist die Schnittstelle des Treibers zur Anwendung im Detail unterschiedlich und nicht vereinheitlicht, was die Portabilität einer CAN-Anwendung verringert.&lt;br /&gt;
Das SocketCAN-Konzept hingegen nutzt das Modell der Netzwerkgeräte. Es gestattet mehreren Anwendungen gleichzeitig auf CAN-Funktionen zuzugreifen. Auch können einzelne Anwendungen mehrere CAN-Netzwerke parallel nutzen.&lt;br /&gt;
&lt;br /&gt;
Im Namen SocketCAN verbirgt sich bereits der wesentliche Aspekt von Sockets. Das SocketCAN Konzept erweitert die klassische Berkeley-Socket-API eines [[Betriebssystem]]s. SocketCAN fügt dazu eine gemeinsame Protokoll-Familie genannt PF_CAN dem Netzwerk-Stack18 hinzu, welches neben anderen bekannten Protokoll-Familien wie z.&amp;amp;nbsp;B. PF_INET fürs Internet unabhängig koexistiert. Elementar besteht SocketCAN selbst aus Netzwerk-Treibern für CAN-Controller und einer Infrastruktur für neue CAN-Protokolle. Mit Raw-Sockets kann direkt auf den CAN-Bus zugegriffen werden.&lt;br /&gt;
&lt;br /&gt;
Daneben gibt es Erweiterungen für Transportprotokolle wie z.&amp;amp;nbsp;B. [[ISO-TP]]. ISO-TP kann größere Datentelegramme bis 4095&amp;amp;nbsp;Bytes in eine Folge kleinerer CAN-Frames segmentieren. Durch eine Adressierung in Form von zwei CAN-ID-Paaren ist der Aufbau einer Punkt-zu-Punkt-Verbindung möglich. Zusätzlich gibt es in SocketCAN ein Broadcast-Manager, der es ermöglicht CAN-Botschaften zu filtern und periodisch zu verschicken. Die Unterstützung für SocketCAN ist zum jetzigen Zeitpunkt ausschließlich für Linux ab der Kernel-Version 2.6.25 gegeben. SocketCAN wird aktiv weiter entwickelt, ständig kommen weitere Netzwerk-Treiber für CAN-Controller hinzu.&lt;br /&gt;
&lt;br /&gt;
== Benutzung ==&lt;br /&gt;
Die Anwendung richtet zunächst den Zugang der CAN-Schnittstelle durch Initialisierung eines Sockets (ähnlich einer [[TCP/IP]]-Kommunikation), bindet diesen Socket (&amp;lt;code&amp;gt;bind&amp;lt;/code&amp;gt;) an eine Schnittstelle (oder alle Schnittstellen, sofern von der Anwendung beabsichtigt).&lt;br /&gt;
Bei erfolgreicher Anbindung, ist der Socket durch z.&amp;amp;nbsp;B. die Funktionen fürs Lesen &amp;lt;code&amp;gt;read(..)&amp;lt;/code&amp;gt; und Schreiben &amp;lt;code&amp;gt;write(..)&amp;lt;/code&amp;gt; nutzbar.&lt;br /&gt;
&lt;br /&gt;
[[Python (Programmiersprache)|Python]] unterstützt SocketCan ab Version 3.3.&amp;lt;ref&amp;gt;[http://bugs.python.org/issue10141 bugs.python.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das nachfolgende einfache Beispiel sendet und liest ein Paket durch die Nutzung des RAW-Socket.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/socket.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/ioctl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;net/if.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;linux/can.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/can/raw.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* At time of writing, these constants are not defined in the headers */&lt;br /&gt;
#ifndef PF_CAN&lt;br /&gt;
#define PF_CAN 29&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifndef AF_CAN&lt;br /&gt;
#define AF_CAN PF_CAN&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/* ... */&lt;br /&gt;
&lt;br /&gt;
/* Somewhere in your app */&lt;br /&gt;
&lt;br /&gt;
   /* Create the socket */&lt;br /&gt;
   int skt = socket( PF_CAN, SOCK_RAW, CAN_RAW );&lt;br /&gt;
&lt;br /&gt;
   /* Locate the interface you wish to use */&lt;br /&gt;
   struct ifreq ifr;&lt;br /&gt;
   strcpy(ifr.ifr_name, &amp;quot;can0&amp;quot;);&lt;br /&gt;
   ioctl(skt, SIOCGIFINDEX, &amp;amp;ifr); /* ifr.ifr_ifindex gets filled&lt;br /&gt;
                          * with that device&amp;#039;s index */&lt;br /&gt;
&lt;br /&gt;
   /* Select that CAN interface, and bind the socket to it. */&lt;br /&gt;
   struct sockaddr_can addr;&lt;br /&gt;
   addr.can_family = AF_CAN;&lt;br /&gt;
   addr.can_ifindex = ifr.ifr_ifindex;&lt;br /&gt;
   bind( skt, (struct sockaddr*)&amp;amp;addr, sizeof(addr) );&lt;br /&gt;
&lt;br /&gt;
   /* Send a message to the CAN bus */&lt;br /&gt;
   struct can_frame frame;&lt;br /&gt;
   frame.can_id = 0x123;&lt;br /&gt;
   strcpy( (char *)frame.data, &amp;quot;foo&amp;quot; );&lt;br /&gt;
   frame.can_dlc = strlen( (const char *)frame.data );&lt;br /&gt;
   int bytes_sent = write( skt, &amp;amp;frame, sizeof(frame) );&lt;br /&gt;
&lt;br /&gt;
   /* Read a message back from the CAN bus */&lt;br /&gt;
   int bytes_read = read( skt, &amp;amp;frame, sizeof(frame) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[can4linux]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://github.com/linux-can/ SocketCAN / Linux CAN Projekt Website]&lt;br /&gt;
* [https://github.com/linux-can/can-utils/ Werkzeuge für SocketCAN (CAN Userspace Tools)]&lt;br /&gt;
* [http://www.pengutronix.de/software/libsocketcan/download/ Userspace Library für SocketCAN]&lt;br /&gt;
* [http://vger.kernel.org/vger-lists.html#linux-can Linux CAN mailing list]&lt;br /&gt;
* [http://dir.gmane.org/gmane.linux.can Linux CAN mail archive (gmane)] [http://marc.info/?l=linux-can Linux CAN mail archive (marc)]&lt;br /&gt;
* [https://www.kernel.org/doc/Documentation/networking/can.txt Aktuelle SocketCAN-Dokumentation im Linux-Kernel-Quellcode] (englisch)&lt;br /&gt;
* [http://elk.informatik.fh-augsburg.de/pub/gnublin-lpc3131/work_eplpc3131/Dokumente/llcf-api.pdf Ursprüngliche LLCF/SocketCAN Dokumentation (2006)] (PDF; 283&amp;amp;nbsp;kB)&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Linux-Betriebssystemkomponente]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Joachim Schnitter</name></author>
	</entry>
</feed>