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-endianbind(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 Verbindungenlisten(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
empfangenconst int FLAGS = 0;char buffer[] = "Message";sendto(sock, buffer, strlen(buffer), FLAGS, &addr, sizeof(addr));
const int FLAGS = 0;char buffer[1024];//receiveint 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];//receiveint bytesread = recv(clientsock, buffer, sizeof(buffer));if(bytesread <= 0)return; //socket was closedprintf("%s", buffer);
Zuletzt geändert: Montag, 14. September 2020, 07:57