41#define _POSIX_C_SOURCE 200809L
45#include <netinet/in.h>
49#include <sys/select.h>
50#include <sys/socket.h>
77 struct addrinfo hints, *res;
80 memset(&hints, 0,
sizeof(hints));
81 hints.ai_socktype = SOCK_STREAM;
82 hints.ai_family = AF_INET;
83 hints.ai_flags = AI_PASSIVE;
85 sprintf(service,
"%d", *port);
86 ai_err = getaddrinfo(host, service, &hints, &res);
88 perror(
"Error fetching host data. Wrong host name?");
93 sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
95 perror(
"Error opening socket");
100 if (connect(sockfd, res->ai_addr, res->ai_addrlen) < 0) {
101 perror(
"Error opening INET socket: wrong port or server unreachable");
106 struct sockaddr_un serv_addr;
109 memset(&serv_addr, 0,
sizeof(serv_addr));
110 serv_addr.sun_family = AF_UNIX;
111 strcpy(serv_addr.sun_path, host);
114 sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
117 if (connect(sockfd, (
struct sockaddr *)&serv_addr,
sizeof(serv_addr)) < 0) {
119 "Error opening UNIX socket: path unavailable, or already existing");
145 struct addrinfo hints, *res;
148 memset(&hints, 0,
sizeof(hints));
149 hints.ai_socktype = SOCK_STREAM;
150 hints.ai_family = AF_INET;
151 hints.ai_flags = AI_PASSIVE;
153 sprintf(service,
"%d", *port);
154 ai_err = getaddrinfo(host, service, &hints, &res);
156 perror(
"Error fetching host data. Wrong host name?");
161 sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
163 perror(
"Error opening socket");
168 if (bind(sockfd, res->ai_addr, res->ai_addrlen) < 0) {
169 perror(
"Error binding INET socket: wrong port or server unreachable");
174 struct sockaddr_un serv_addr;
177 memset(&serv_addr, 0,
sizeof(serv_addr));
178 serv_addr.sun_family = AF_UNIX;
179 strcpy(serv_addr.sun_path, host);
182 sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
184 remove(serv_addr.sun_path);
187 if (bind(sockfd, (
struct sockaddr *)&serv_addr,
sizeof(serv_addr)) < 0) {
189 "Error binding UNIX socket: path unavailable, or already existing");
205 int sockfd = *psockfd;
208 n = write(sockfd, data, len);
210 perror(
"Error writing to socket: server has quit or connection broke");
223 int sockfd = *psockfd;
226 n = nr = read(sockfd, data, len);
228 while (nr > 0 && n < len) {
229 nr = read(sockfd, &data[n], len - n);
234 perror(
"Error reading from socket: server has quit or connection broke");
247 if (listen(*psockfd, *backlog) < 0) {
248 perror(
"Error listening socket");
260 int client_fd = accept(*psockfd, NULL, NULL);
262 *pclientfd = client_fd;
282 struct timespec wt, rem;
283 wt.tv_sec = floor(*dsec);
284 wt.tv_nsec = (*dsec - wt.tv_sec) * 1000000000;
285 nanosleep(&wt, &rem);
void open_bind_socket(int *psockfd, int *inet, int *port, char *host)
Opens and binds a socket.
void open_connect_socket(int *psockfd, int *inet, int *port, char *host)
Opens and connects a socket.
void writebuffer(int *psockfd, char *data, int *plen)
Writes to a socket.
void accept_socket(int *psockfd, int *pclientfd)
Listens to a socket.
void uwait(double *dsec)
Mini-wrapper to nanosleep.
void close_socket(int *psockfd)
Closes a socket.
void listen_socket(int *psockfd, int *backlog)
Listens to a socket.
void readbuffer(int *psockfd, char *data, int *plen)
Reads from a socket.
void remove_socket_file(char *host)
Removes a socket file.