#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 xbind(const int port){ /* [0] Initialization =========================================================*/ int xsocket, bound, clientsock; static struct sockaddr_in addr; /* [1] Create xsocket =========================================================*/ /* (1) Create UPD xsocket */ DEBUG&& debug("xbind", "creating server socket"); xsocket = socket(AF_INET, SOCK_STREAM, 0); /* (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 */ DEBUG&& debug("xbind", "binding socket to port"); bound = bind(xsocket, (struct sockaddr*)&addr, sizeof(addr)); /* (2) Manage error */ if( bound == -1 ){ DEBUG&& printf("error\n"); return -1; } DEBUG&& printf("done\n"); /* [4] Mark socket so it will listen for incoming co. =========================================================*/ DEBUG&& debug("xbind", "listen for client"); if( listen(xsocket, 1) < 0 ){ DEBUG&& printf("error\n"); return -1; } DEBUG&& printf("done\n"); /* [5] Return xsocket =========================================================*/ return xsocket; } int xlisten(const int xsocket, struct sockaddr_in* client){ /* [1] Initialization =========================================================*/ unsigned int sock_len; int clientsock; /* [2] Wait for client =========================================================*/ /* (1) Wait for incoming client connection */ DEBUG&& debug("xlisten", "listening for client"); clientsock = accept(xsocket, (struct sockaddr*) client, &sock_len); /* (2) Manage errors */ if( clientsock == -1 ){ DEBUG&& printf("error\n"); return -1; } DEBUG&& printf("done\n"); return clientsock; } int xconnect(const char* hostname, const int port, struct sockaddr_in* serv){ /* [0] Initialization =========================================================*/ int xsocket, bound, connected; struct hostent *host; // data found by lookup /* [1] Create xsocket =========================================================*/ /* (1) Create UPD xsocket */ DEBUG&& debug("xconnect", "creating client socket"); xsocket = socket(AF_INET, SOCK_STREAM, 0); /* (r2-) Manage error */ if( xsocket == -1 ){ DEBUG&& printf("error\n"); return -1; } DEBUG&& printf("done\n"); /* [2] Get information by hostname =========================================================*/ /* (1) Process */ DEBUG&& debug("xconnect", "fetch info by hostname"); host = gethostbyname(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 */ DEBUG&& debug("xconnect", "building server info"); bzero(serv, sizeof(struct sockaddr_in)); /* (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"); /* [4] Connect to server =========================================================*/ /* (1) Try to connect to given server */ DEBUG&& debug("xconnect", "connecting to server"); connected = connect(xsocket, (struct sockaddr*) serv, sizeof(*serv)); /* (2) Manage error */ if( connected == -1 ){ DEBUG&& printf("error\n"); return -1; } DEBUG&& printf("done\n"); // return socket return xsocket; } int xread(const int xsocket, char* buffer, int bufsize){ /* [1] Wait for message through xsocket =========================================================*/ /* (1) Memory allocation */ buffer = (char*) realloc(buffer, sizeof(char) * bufsize ); /* (2) Listen */ DEBUG&& debug("xread", "waiting for data"); int read = recv(xsocket, buffer, bufsize, 0); /* (3) Manage error */ if( read == -1 ){ DEBUG&& printf("error\n"); return -1; } DEBUG&& printf("received\n"); DEBUG&& printf("[xread:received] '%s'\n", buffer); /* [2] Return number of read characters =========================================================*/ return read; } int xwrite(const int xsocket, char* buffer){ /* [1] Send buffer (message) to target =========================================================*/ /* (1) Useful data */ unsigned int addr_len = sizeof(struct sockaddr_in); /* (2) Send data */ DEBUG&& debug("xwrite", "sending data"); int sent = send(xsocket, buffer, strlen(buffer), 0); /* (3) Manage error */ if( sent == -1 ){ DEBUG&& printf("error\n"); return -1; } DEBUG&& printf("sent\n"); DEBUG&& printf("[xwrite:sent] '%s'\n", buffer); /* [2] Return number of sent characters =========================================================*/ return sent; }