A messenger application for Raspberry Pi Zerofor A.U.TH (Real time Embedded systems).
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

113 lines
3.2 KiB

  1. /*!
  2. * \file listener.c
  3. * \brief Listener related functionality
  4. *
  5. * \author Christos Choutouridis AEM:8997 <cchoutou@ece.auth.gr>
  6. */
  7. #include <sys/socket.h>
  8. #include <arpa/inet.h>
  9. #include <unistd.h>
  10. #include <string.h>
  11. #include <stdio.h>
  12. //#include <pthread.h>
  13. #include "listener.h"
  14. static void srv_action (device_t* d, char_t* buffer, size_t size) {
  15. msg_t msg = { .sender =*d, .recipients =NULL };
  16. cMsg_parse (&msg.cMsg, buffer, size);
  17. mIter_t myCopy = msgList_find (&msgList, &msg);
  18. if (myCopy == -1) {
  19. // I don't have a copy after all
  20. msgList_add (&msgList, &msg);
  21. log_msg_io (&msg); // semaphore
  22. }
  23. else {
  24. // Do not forward a duplicate message to sender, he already has it
  25. devList_add (&msgList, myCopy, &msg.sender);
  26. #ifndef NO_DEBUG
  27. log_debug("Debug: Duplicate message from: %d\n", msg.sender.id);
  28. #endif
  29. }
  30. }
  31. status_t listener() {
  32. int srvSock;
  33. struct sockaddr_in srvAddPort;
  34. char_t buffer[256];
  35. memset(&srvAddPort, 0, sizeof(srvAddPort));
  36. srvAddPort.sin_family= AF_INET;
  37. srvAddPort.sin_port= htons(settings.port);
  38. srvAddPort.sin_addr.s_addr = htonl(INADDR_ANY);
  39. if ((srvSock = socket (PF_INET, SOCK_STREAM, 0)) == -1) {
  40. log_error ("Error: Can not create socket\n");
  41. return MSG_ERROR;
  42. }
  43. #ifndef NO_DEBUG
  44. log_debug("Debug: Socket for listening created\n");
  45. #endif
  46. if(bind(srvSock, (struct sockaddr *) &srvAddPort, sizeof(srvAddPort)) == -1) {
  47. log_error ("Error: Can not bind socket to port %d\n", settings.port);
  48. close (srvSock);
  49. return MSG_ERROR;
  50. }
  51. if (listen (srvSock, DEVICE_LIST_SIZE) == -1) {
  52. log_error ("Error: Can not enable socket\n");
  53. close (srvSock);
  54. return MSG_ERROR;
  55. }
  56. #ifndef NO_DEBUG
  57. log_debug("Debug: Listening on [0.0.0.0], port %d\n", settings.port);
  58. #endif
  59. while (1) {
  60. struct sockaddr_in clntAddr;
  61. size_t clntLen= sizeof(clntAddr);
  62. int clntSock;
  63. int rcvBytes;
  64. if ((clntSock = accept (srvSock, (struct sockaddr *)&clntAddr, (socklen_t*)&clntLen)) == -1) {
  65. close (srvSock);
  66. continue;
  67. }
  68. #ifndef NO_DEBUG
  69. devIP_t ip = addr2ip(ntohl(clntAddr.sin_addr.s_addr));
  70. log_debug ("Debug: Connection from %u.%u.%u.%u port:%u received\n",
  71. ip.A, ip.B, ip.C, ip.D, clntAddr.sin_port
  72. );
  73. #endif
  74. if ((rcvBytes = recv(clntSock, buffer, sizeof(buffer), 0)) < 0) {
  75. log_error ("Error: Fail to receive from socket\n");
  76. close (srvSock);
  77. close (clntSock);
  78. continue;
  79. }
  80. buffer[rcvBytes] = '\0';
  81. close(clntSock);
  82. device_t dev = addr2device (ntohl(clntAddr.sin_addr.s_addr));
  83. #ifndef NO_DEBUG
  84. log_debug ("Debug: Message from %u.%u.%u.%u port:%u received\n");
  85. #endif
  86. srv_action (&dev, buffer, rcvBytes);
  87. }
  88. close(srvSock);
  89. #ifndef NO_DEBUG
  90. log_debug ("Debug: Socket for listening closed\n");
  91. #endif
  92. return MSG_OK;
  93. }
  94. void* thListener(void* ptr) {
  95. (void)&ptr; // use parameter
  96. listener();
  97. return NULL;
  98. }