#include "lib.h" int debug(const char* tag, const char* msg){ /* (1) Get number of characters to add */ int diff = DEBUG_LEN - strlen(msg) - strlen(tag) - 3; /* (2) print msg */ printf("[%s] %s", tag, msg); /* (3) print missing characters */ for( ; diff >= 0 ; diff-- ) printf("."); return 1; } int xlisten(const int port){ /* [0] Initialization =========================================================*/ int xsocket, bound; static struct sockaddr_in addr; /* [1] Create xsocket =========================================================*/ /* (1) Create UPD xsocket */ xsocket = socket(AF_INET, SOCK_DGRAM, 0); DEBUG&& debug("xlisten", "creating server socket"); /* (r2-) Manage error */ if( xsocket == -1 ){ DEBUG&& printf("error\n"); return -1; } DEBUG&& printf("done\n"); /* [2] Set xsocket address information =========================================================*/ /* (1) Reset values */ bzero(&addr, sizeof(struct sockaddr_in)); /* (2) Set xsocket addr */ addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr.s_addr = htonl(INADDR_ANY); /* [3] Bind to port =========================================================*/ /* (1) Bind and return -1 if error */ bound = bind(xsocket, (struct sockaddr*)&addr, sizeof(addr)); DEBUG&& debug("xlisten", "binding socket to port"); /* (2) Manage error */ if( bound == -1 ){ DEBUG&& printf("error\n"); return -1; } DEBUG&& printf("done\n"); /* [4] Return xsocket =========================================================*/ return xsocket; } int xconnect(const char* hostname, const int port, struct sockaddr_in* serv){ /* [0] Initialization =========================================================*/ int xsocket, bound; struct hostent *host; // data found by lookup /* [1] Create xsocket =========================================================*/ /* (1) Create UPD xsocket */ xsocket = socket(AF_INET, SOCK_DGRAM, 0); DEBUG&& debug("xconnect", "creating client socket"); /* (r2-) Manage error */ if( xsocket == -1 ){ DEBUG&& printf("error\n"); return -1; } DEBUG&& printf("done\n"); /* [2] Get information by hostname =========================================================*/ /* (1) Process */ host = gethostbyname(hostname); DEBUG&& debug("xconnect", "fetch info by hostname"); /* (2) Manage error */ if( host == NULL ){ DEBUG&& printf("error\n"); return -1; } DEBUG&& printf("found\n"); /* [3] Set server useful information from fetched info =========================================================*/ /* (1) Reset values */ bzero(serv, sizeof(struct sockaddr_in)); DEBUG&& debug("xconnect", "building server info"); /* (2) Set server info (ipv4, port) */ serv->sin_family = AF_INET; serv->sin_port = htons(port); /* (3) Copy server address */ memcpy( &serv->sin_addr.s_addr, host->h_addr, host->h_length); DEBUG&& printf("built\n"); // return socket return xsocket; } int xread(const int xsocket, struct sockaddr_in *client, char* buffer, int bufsize){ /* [1] Wait for message through xsocket =========================================================*/ /* (1) Useful data + memory allocation */ socklen_t sock_len = sizeof(struct sockaddr_in); buffer = (char*) realloc(buffer, sizeof(char) * bufsize ); /* (2) Listen */ DEBUG&& debug("xread", "waiting for data"); int read = recvfrom(xsocket, buffer, bufsize / sizeof(char) + sizeof(char), 0, (struct sockaddr*) client, &sock_len); /* (3) Manage error */ if( read == -1 ){ DEBUG&& printf("error\n"); return -1; } DEBUG&& printf("received\n"); printf("[xread:received] '%s'\n", buffer); /* [2] Return number of read characters =========================================================*/ return read; } int xwrite(const int xsocket, char* buffer, struct sockaddr_in* target){ /* [1] Send buffer (message) to target =========================================================*/ /* (1) Useful data */ size_t addr_len = sizeof(struct sockaddr_in); /* (2) Send data */ DEBUG&& debug("xwrite", "sending data"); int sent = sendto(xsocket, buffer, strlen(buffer)+1, 0, (struct sockaddr*) target, addr_len); /* (3) Manage error */ if( sent == -1 ){ DEBUG&& printf("error\n"); return -1; } DEBUG&& printf("sent\n"); printf("[xwrite:sent] '%s'\n", buffer); /* [2] Return number of sent characters =========================================================*/ return sent; }