MEMO: Sockets in C

Includes

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <netdb.h>
#include <stdlib.h>


Client

Socket erstellen

int sock = socket(domain, type, protocol);
  • domain = AF_INET oder AF_INET6
  • type = SOCK_STREAM oder SOCK_DGRAM
  • protocol = 0 für IP (siehe /etc/procotols)

zum Vermeiden von "address already in use":

int value = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &value, sizeof(value));

optional: an Port binden

struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(12345); //network-byte-order = big-endian
bind(sock, &addr, sizeof(addr));

TCP: connect

struct sockaddr_in serv_addr;
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_port = htons(433);
serv_addr.sin_family = AF_INET;

if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0)
return -1;
if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0)
return -1;


Server

Socket erstellen

int sock = socket(domain, type, protocol);

int value = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &value, sizeof(value));

an Port binden

sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY; //oder inet_pton(..)
addr.sin_port = htons(12345);
bind(sock, &addr, sizeof(addr));

TCP

listening Socket starten

int backlog = 5; //maximale Anzahl der nicht akzeptierten Verbindungen
listen(sock, backlog);

Verbindung annehmen

sockaddr clientaddr;
socklen_t clientaddrlen;

int clientsock = accept(sock, &clientaddr, &clientaddrlen);
if(fork() == 0) {
// handle client...
}


Daten senden/empfangen:

UDP

senden

const int FLAGS = 0;
char buffer[] = "Message";

sendto(sock, buffer, strlen(buffer), FLAGS, &addr, sizeof(addr));
empfangen

const int FLAGS = 0;
char buffer[1024];

//receive
int bytesread = recvfrom(sock, buffer, sizeof(buffer), FLAGS, &addr, &addrlen);
if(bytesread <= 0)
return; //error

printf("%s", buffer);

TCP

senden

const int FLAGS = 0;
char buffer[] = "Message";

send(clientsock, buffer, strlen(buffer), FLAGS);

empfangen

const int FLAGS = 0;
char buffer[1024];

//receive
int bytesread = recv(clientsock, buffer, sizeof(buffer));
if(bytesread <= 0)
return; //socket was closed

printf("%s", buffer);

Zuletzt geändert: Montag, 14. September 2020, 07:57