A messenger application for Raspberry Pi Zerofor A.U.TH (Real time Embedded systems).
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 
 

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. }