tcplistener.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include <arpa/inet.h>
  2. #include <netdb.h>
  3. #include <string.h>
  4. #include <sys/types.h>
  5. #include <unistd.h>
  6. #include <iostream>
  7. #include <string>
  8. #include <sys/socket.h>
  9. #include "headers/constants.h"
  10. #include "headers/tcplistener.h"
  11. int listening() { return socket(AF_INET, SOCK_STREAM, 0); }
  12. TcpListener::TcpListener(std::string ipAddress, int port,
  13. MessageReceivedHandler handler)
  14. : m_ipAddress(ipAddress), m_port(port), MessageReceived(handler) {}
  15. // destructor
  16. TcpListener::~TcpListener() { cleanup(); }
  17. // Send message to client
  18. void TcpListener::sendMessage(int clientSocket, std::string msg) {
  19. send(clientSocket, msg.c_str(), msg.size() + 1, 0);
  20. }
  21. // Initialize
  22. bool TcpListener::init() {
  23. std::cout << "Initializing socket listener" << std::endl;
  24. return true;
  25. }
  26. // Main process loop
  27. void TcpListener::run() {
  28. char* buf[MAX_BUFFER_SIZE];
  29. while (true) {
  30. int listening = createSocket();
  31. if (listening == SOCKET_ERROR) {
  32. std::cout << "Socket error: shutting down server" << std::endl;
  33. break;
  34. }
  35. int socket = waitForConnection(listening);
  36. if (socket != SOCKET_ERROR) {
  37. close(listening);
  38. while (true) {
  39. memset(buf, 0, MAX_BUFFER_SIZE);
  40. int bytesReceived = 0;
  41. bytesReceived = recv(socket, buf, MAX_BUFFER_SIZE, 0);
  42. if (bytesReceived > 0) {
  43. const char* constString = (const char*)buf;
  44. std::cout << "Received: " << constString << std::endl;
  45. MessageReceived(this, socket, std::string(constString));
  46. } else {
  47. std::cout << "client disconnected" << std::endl;
  48. break;
  49. }
  50. }
  51. close(socket);
  52. }
  53. }
  54. }
  55. // Cleanup
  56. void TcpListener::cleanup() { std::cout << "Cleaning up" << std::endl; }
  57. int TcpListener::createSocket() {
  58. int listening = socket(AF_INET, SOCK_STREAM, 0);
  59. if (listening != SOCKET_ERROR) {
  60. sockaddr_in hint;
  61. hint.sin_family = AF_INET;
  62. hint.sin_port = htons(m_port);
  63. inet_pton(AF_INET, m_ipAddress.c_str(), &hint.sin_addr);
  64. int bindOk = bind(listening, (sockaddr*)&hint, sizeof(hint));
  65. if (bindOk != SOCKET_ERROR) {
  66. int listenOk = listen(listening, SOMAXCONN);
  67. if (listenOk == SOCKET_ERROR) {
  68. return -1;
  69. }
  70. } else {
  71. return -1;
  72. }
  73. }
  74. return listening;
  75. }
  76. int TcpListener::waitForConnection(int listening) {
  77. int client = accept(listening, NULL, NULL);
  78. return client;
  79. }