|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- /*!
- * \file listener.c
- * \brief Listener related functionality
- *
- * \author Christos Choutouridis AEM:8997 <cchoutou@ece.auth.gr>
- */
-
- #include <sys/socket.h>
- #include <arpa/inet.h>
- #include <unistd.h>
- #include <string.h>
- #include <stdio.h>
- //#include <pthread.h>
-
- #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;
- }
-
|