/*! * \file listener.c * \brief Listener related functionality * * \author Christos Choutouridis AEM:8997 */ #include #include #include #include #include //#include #include "listener.h" static void srv_action (device_t* d, char_t* buffer, size_t size) { msg_t msg = { .sender =*d, .recipients =NULL }; cMsg_parse (&msg.cMsg, buffer, size); mIter_t myCopy = msgList_find (&msgList, &msg); if (myCopy == -1) { // I don't have a copy after all msgList_add (&msgList, &msg); log_msg_io (&msg); // semaphore } else { // Do not forward a duplicate message to sender, he already has it devList_add (&msgList, myCopy, &msg.sender); #ifndef NO_DEBUG log_debug("Debug: Duplicate message from: %d\n", msg.sender.id); #endif } } status_t listener() { int srvSock; struct sockaddr_in srvAddPort; char_t buffer[256]; memset(&srvAddPort, 0, sizeof(srvAddPort)); srvAddPort.sin_family= AF_INET; srvAddPort.sin_port= htons(settings.port); srvAddPort.sin_addr.s_addr = htonl(INADDR_ANY); if ((srvSock = socket (PF_INET, SOCK_STREAM, 0)) == -1) { log_error ("Error: Can not create socket\n"); return MSG_ERROR; } #ifndef NO_DEBUG log_debug("Debug: Socket for listening created\n"); #endif if(bind(srvSock, (struct sockaddr *) &srvAddPort, sizeof(srvAddPort)) == -1) { log_error ("Error: Can not bind socket to port %d\n", settings.port); close (srvSock); return MSG_ERROR; } if (listen (srvSock, DEVICE_LIST_SIZE) == -1) { log_error ("Error: Can not enable socket\n"); close (srvSock); return MSG_ERROR; } #ifndef NO_DEBUG log_debug("Debug: Listening on [0.0.0.0], port %d\n", settings.port); #endif while (1) { struct sockaddr_in clntAddr; size_t clntLen= sizeof(clntAddr); int clntSock; int rcvBytes; if ((clntSock = accept (srvSock, (struct sockaddr *)&clntAddr, (socklen_t*)&clntLen)) == -1) { close (srvSock); continue; } #ifndef NO_DEBUG devIP_t ip = addr2ip(ntohl(clntAddr.sin_addr.s_addr)); log_debug ("Debug: Connection from %u.%u.%u.%u port:%u received\n", ip.A, ip.B, ip.C, ip.D, clntAddr.sin_port ); #endif if ((rcvBytes = recv(clntSock, buffer, sizeof(buffer), 0)) < 0) { log_error ("Error: Fail to receive from socket\n"); close (srvSock); close (clntSock); continue; } buffer[rcvBytes] = '\0'; close(clntSock); device_t dev = addr2device (ntohl(clntAddr.sin_addr.s_addr)); #ifndef NO_DEBUG log_debug ("Debug: Message from %u.%u.%u.%u port:%u received\n"); #endif srv_action (&dev, buffer, rcvBytes); } close(srvSock); #ifndef NO_DEBUG log_debug ("Debug: Socket for listening closed\n"); #endif return MSG_OK; } void* thListener(void* ptr) { (void)&ptr; // use parameter listener(); return NULL; }