#include /* for printf() and fprintf() */ #include /* for socket(), bind(), and connect() */ #include /* for sockaddr_in and inet_ntoa() */ #include /* for atoi() and exit() */ #include /* for memset() */ #include /* for close() */ #include /* for errno */ #include #include "../include/monitor.h" extern int verbose; int initServerSocket(in_port_t port, int backlog) { int sock; /* socket descriptor for server */ struct sockaddr_in addr; /* Local address */ /* Create socket for incoming connections */ if (-1 == (sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP))) { syslogMonitor(LOG_ERR, MON_INFO, "server.socket", "error opening socket: %s - service terminated", strerror(errno)); exit(EXIT_FAILURE); } /* Construct local address structure */ memset(&addr, 0, sizeof(addr)); /* Zero out structure */ addr.sin_family = AF_INET; /* Internet address family */ addr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */ addr.sin_port = htons(port); /* Local port */ /* Bind to the local address */ if (-1 == bind(sock, (struct sockaddr *) &addr, sizeof(addr))) { syslogMonitor(LOG_ERR, MON_INFO, "server.bind", "error binding socket: %s - service terminated", strerror(errno)); exit(EXIT_FAILURE); } /* Mark the socket so it will listen for incoming connections */ if (-1 == listen(sock, backlog)) { syslogMonitor(LOG_ERR, MON_INFO, "server.listen", "error binding socket: %s - service terminated", strerror(errno)); exit(EXIT_FAILURE); } return sock; } int acceptConnection(int servSock, char remoteAddr[16]) { int sock; /* Socket descriptor for client */ struct sockaddr_in addr; /* Client address */ unsigned int len; /* Length of client address data structure */ /* Set the size of the in-out parameter */ len = sizeof(addr); /* Wait for a client to connect */ if (-1 == (sock = accept(servSock, (struct sockaddr *) &addr, &len))) { syslogMonitor(LOG_ERR, MON_INFO, "server.accept", "error acception connection: %s", strerror(errno)); } else { strncpy (remoteAddr, inet_ntoa(addr.sin_addr), sizeof(remoteAddr)-1); } /* clntSock is connected to a client! */ if (0 != verbose) { syslog(LOG_INFO, "handling client %s\n", inet_ntoa(addr.sin_addr)); } return sock; }