A messenger application for Raspberry Pi Zerofor A.U.TH (Real time Embedded systems).
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 
 

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