1. Index
  2. Shell
  3. C
  4. POSIX
  5. JavaScript

Netzwerk

Rechner kommunizieren entweder bidirektional über stromorientierte Protokolle (TCP) oder unidirektional über nachrichtenorientierte Protokolle (UDP). Dabei hat sich das Internet Protokoll als Standard durchgesetzt.

Dienste, Protokolle und Schichten
Daemon Apache Postfix Dovecot Dnsmasq Chrony Ping Samba
Anwendung HTTP SMTP IMAP DNS NTP SMB
Transport TCP UDP NetBIOS
Netzwerk IP ICMP NetBEUI
Verbindung Ethernet (MAC) Wireless (SSID) FDDI, …

unistd.h

Der Hostname wird beim Start des Rechners aus /etc/hostname gelesen. Nur privilegierten Benutzer dürfen den Namen ändern. Auf der Kommandozeile wird er mit hostname(1) abgefragt.

int gethostname ( char * name, size_t len) Eigener Hostname
int sethostname (const char * name, size_t len)
int getdomainname ( char * name, size_t len) Eigene Domäne
int setdomainname (const char * name, size_t len)
long gethostid (void) Identifikation
int sethostid (long hostid)

utsname.h

Betriebssystem identifizieren. Auf der Kommandozeile mit uname(1).

struct utsname
char sysname[] "Linux" Kernelname
char nodename[] "debian" Hostname
char release[] "3.16.0-4-amd64" Kernelversion
char version[] "#1 SMP … (2015-07-17)" Kerneldatum
char machine[] "x86_64" Systemarchitektur
intuname (struct utsname * buf) Betriebssystem identifizieren

net/if.h

Schnittstellen auflisten. Auf der Kommandozeile mit ip link. Typische Namen sind zum Beispiel lo, eno1 etc.

struct if_nameindex
unsigned int if_index
char * if_name
struct if_nameindex *if_nameindex(void)
void if_freenameindex (struct if_nameindex * ptr)
char * if_indextoname (unsigned int index, char * name)
unsigned int if_nametoindex ( const char * name)
IF_NAMESIZE Mindestgröße für den name Parameter in if_indextoname.

sys/un.h

Datenstruktur für Unix Domain Sockets.

struct sockaddr_un
sa_family_t sun_family AF_LOCAL
char sun_path[100] Pfad

netinet/in.h

Datenstrukturen für Internet-Adressen.

typedef in_addr_t uint32_t IPv4-Adresse
typedef in_port_t uint16_t Portnummer
struct in_addr
in_addr_t s_addr IPv4-Adresse (32 Bit)
struct sockaddr_in
sa_family_t sin_family AF_INET
in_port_t sin_port Portnummer
struct in_addr sin_addr IPv4 Adresse
unsigned char sin_zero[] Padding
struct in6_addr
uint8_t s6_addr[16] IPv6 Adresse (128 Bit)
struct sockaddr_in6
sa_family_t sin_family AF_INET6
in_port_t sin6_port Portnummer auf der Transportschicht
uint32_t sin6_flowinfo IPv6 Flussinformation
struct in6_addr sin6_addr IPv6 Adresse
uint32_t sin6_scope_id IPv6 scope-id

netinet/tcp.h

TCP Flags:

#define TCP_NODELAY

arpa/inet.h

Adressen umrechnen

uint32_t htonl (uint32_t hostlong) Adresse
uint32_t ntohl (uint32_t netlong)
uint16_t htons (uint16_t hostshort) Portnummer
uint16_t ntohs (uint16_t netshort)
in_addr_t inet_addr (const char * cp) Dezimaldarstellung
int inet_aton (const char * cp, struct in_addr * in)
char * inet_ntoa ( struct in_addr in)
const char * inet_ntop (int af, const void * src, char * dst, socklen_t cnt)
int inet_pton (int af, const char * src, void * dst)
struct in_addr inet_makeaddr (int net, int host) Kombination
in_addr_t inet_lnaof (struct in_addr in) Hostadresse
in_addr_t inet_netof (struct in_addr in) Netzwerkadresse
in_addr_t inet_network (const char * cp) Netzwerkadresse

netdb.h

Um Hostnamen zu Adressen auflösen, list Der NSS die Datei /etc/nsswitch.conf, wo normalerweise zuerst die Datei /etc/hosts konsultiert wird, bevor Anfragen per /etc/resolv.conf im DNS aufgelöst werden.

extern int h_errno
struct addrinfo
int ai_flags
int ai_family
int ai_socktype
int ai_protocol
size_t ai_addrlen
struct sockaddr * ai_addr
char * ai_canonname
struct addrinfo * ai_next
int getaddrinfo (const char * node, const char * service,
const struct addrinfo * hints,
struct addrinfo ** res)
int getnameinfo (const struct sockaddr * sa, socklen_t salen,
char * host, size_t hostlen,
char * serv, size_t servlen, int flags)
void freeaddrinfo (struct addrinfo * res)
const char * gai_strerror (int errcode)

Lesen von /etc/hosts

struct hostent
char * h_name
char ** h_aliases
int h_addrtype
int h_length
char ** h_addr_list
void sethostent (int stayopen)
void endhostent (void)
struct hostent * gethostent (void)
struct hostent * gethostbyaddr (const void * addr, int len, int type)
struct hostent * gethostbyname (const char * name)
struct hostent * gethostbyname2 (const char * name, int domain)
int gethostent_r (struct hostent * ret, char * buf, size_t len,
struct hostent ** result, int * err)
int gethostbyname_r(const char * name,
struct hostent * ret, char * buf, size_t len,
struct hostent ** result, int * err)
int gethostbyname2_r(const char * name, int af,
struct hostent * ret, char * buf, size_t len,
struct hostent ** result, int * err)
void herror (const char * s)
const char * hstrerror (int err)

Lesen von /etc/services

struct servent
char * s_name
char ** s_aliases
int s_port
char * s_proto
void setservent (int stayopen)
void endservent (void)
struct servent * getservent (void)
struct servent * getservbyname (const char * name, const char * proto)
struct servent * getservbyport (int port, const char * proto)

Lesen von /etc/networks

struct netent
char * n_name
char ** n_aliases
int n_addrtype
uint32_t n_net
void setnetent (int stayopen)
void endnetent (void)
struct netent * getnetent (void)
struct netent * getnetbyname (const char * name)
struct netent * getnetbyaddr (uint32_t net, int type)

Lesen von /etc/protocols

struct protoent
char * p_name
char ** p_aliases
int p_proto
void setprotoent (int stayopen)
void endprotoent (void)
struct protoent * getprotoent (void)
struct protoent * getprotobyname (const char * name)
struct protoent * getprotobynumber(int proto)
AI_CANONNAME
AI_PASSIVE
AI_V4MAPPED
AI_ALL
AI_NOFQDN Nur den Hostnamen ermitteln
AI_NUMERICHOST Numerische Adresse statt Hostname ermitteln
AI_NAMEREQD Fehlermeldung statt Numerische Adresse
AI_NUMERICSERV Port Nummer statt Dienstname zurückliefern
AI_DGRAM Datagrammdienst UDP statt Stromdienst TCP liefern, meistens gleich
AF_UNSPEC Unbekannt
AF_LOCAL Unix Domain Socket
AF_INET IPv4 Adresse (32 Bit)
AF_INET6 IPv6 Adresse (128 Bit)
SOCK_DGRAM Verbindungslos und unsicher
SOCK_STREAM Verbindungsorientiert und sicher
UDP Verbindungslos (SOCK_DGRAM)
TCP Verbindungsorientiert (SOCK_STREAM)

sys/socket.h

Netzwerk-Sockel erzeugen

int socket (int domain, int type, int protocol)
int socketpair (int domain, int type, int protocol, int fd[2])
int sockatmark (int fd)
struct sockaddr
sa_family_tsa_family
char sa_data[14]
int bind (int fd, const struct sockaddr * addr, socklen_t len)
int listen (int fd, int backlog)
int accept (int fd, struct sockaddr * addr, socklen_t * len)
int connect (int fd, const struct sockaddr * addr, socklen_t len)
int shutdown (int fd, int how)
int getsockname (int fd, struct sockaddr * addr, socklen_t * len)
int getpeername (int fd, struct sockaddr * addr, socklen_t * len)
int getsockopt (int fd, int level, int optname,
void * optval, socklen_t * optlen)
int setsockopt (int fd, int level, int optname,
const void * optval, socklen_t optlen)
ssize_t send (int fd, const void * buf, size_t len, int flags)
ssize_t sendto (int fd, const void * buf, size_t len, int flags,
const struct sockaddr * to, socklen_t len)
ssize_t recv (int fd, void * buf, size_t len, int flags)
ssize_t recvfrom (int fd, void * buf, size_t len, int flags,
struct sockaddr * from, socklen_t * len)
struct msghdr
void * msg_name
socklen_t msg_namelen
struct iovec *msg_iov
size_t msg_iovlen
void * msg_control
socklen_t msg_controllen
int msg_flags
ssize_t sendmsg (int fd, const struct msghdr * msg, int flags)
ssize_t recvmsg (int fd, struct msghdr * msg, int flags)
PF_LOCAL Lokale Kommunikation
PF_INET Internet Protokoll Version 4
PF_INET6 Internet Protokoll Version 6
PF_IPX Novell Protokoll
PF_NETLINK Kernel user interface device
PF_X25 ITU-T X.25 / ISO-8208 Protokoll
PF_AX25 Amateur radio AX.25 Protokoll
PF_ATMPVC Access to raw ATM PVCs
PF_APPLETALK Appletalk
PF_PACKETLow level packet interface
SOCK_STREAM Verbindungsorientierte, zuverlässige Zwei-Wege-Kommunikation (TCP)
SOCK_DGRAM Verbidungslose, unzuverlässige Datagramme (UDP)
SOCK_SEQPACKET Sequenzielle, zuverlässige Zweiwegeverbindung
SOCK_RAW Rohzugriff auf das Netzwerkprotokoll
SOCK_RDM Verbindungslose, zuverlässige Datageamme mit zufälliger Reihenfolge
SOCK_PACKETObsolet
SOL_SOCKET
TCP
SO_KEEPALIVE Nachrichten zum Aufrechterhalten der Verbindung senden
SO_OOBINLINE Band-externe Daten in den regulären Datenstrom einbetten
SO_RCVLOWAT
SO_SNDLOWAT
SO_RCVTIMEO
SO_SNDTIMEO
SO_BSDCOMPAT Obsolet
SO_PASSCRED Anmeldeinformationen senden (nur PF_LOCAL)
SO_PEERCRED Anmeldeinformationen empfangen (nur PF_LOCAL)
SO_BINDTODEVICE Sockel an ein Gerät binden, zum Beispiel eno1
SO_DEBUG Fehlersuchodus anschalten
SO_REUSEADDR bind soll Adressen wiederverwenden
SO_TYPE Sockeltyp feststellen, zum Beispiel SOCK_STREAM (nur getsockopt)
SO_ACCEPTCONN Feststellen ob der Sockel Verbindungen akzeptiert
SO_DONTROUTE Nur an direkt erreichbare Rechner senden
SO_BROADCAST Flag für Rundsendung abfragen oder setzen
SO_SNDBUF Größe des Sendepuffers ermitteln oder setzen
SO_RCVBUF Größe des Empfangspuffer ermitteln oder setzen
SO_LINGER Sets or gets the SO_LINGER option. The argument is a linger structure.
SO_PRIORITY Protokollspezifische Priorität festlegen
SO_ERROR Fehlerstatus zurücksetzen (nur getsockopt)
SHUT_RD Lesezugriff unterbinden
SHUT_WR Schreibzugriff unterbinden
SHUT_RDWR Jeglichen Zugriff unterbinden
MSG_OOB Band-externe Daten empfangen
MSG_PEEK Vorschau in den Empfangspuffer
MSG_WAITALL Blockieren, bis alle angeforderten Daten vorliegen
MSG_TRUNC Echte Größe des Pakets ermitteln
MSG_ERRQUEUE Wartende Fehler entgegennehmen

Literatur

  1. Brian Hall: Beej's Guide to Network Programming