client.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include <client.hpp>
  2. #include <arpa/inet.h>
  3. #include <netdb.h>
  4. #include <string.h>
  5. #include <sys/socket.h>
  6. #include <sys/types.h>
  7. #include <unistd.h>
  8. #include <thread>
  9. #include <cstring>
  10. #include <QDebug>
  11. #include <QByteArray>
  12. #include <string>
  13. #include <iostream>
  14. void input_loop(char buffer[]) {
  15. qDebug() << "Enter message: ";
  16. for (;;) {
  17. std::cin >> buffer;
  18. if (buffer[0] != 0) {
  19. return;
  20. }
  21. }
  22. }
  23. //hostCombo(new QComboBox),
  24. // portLineEdit(new QLineEdit),
  25. // getFortuneButton(new QPushButton(tr("Get Fortune"))),
  26. // tcpSocket(new QTcpSocket(this)) {
  27. // setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
  28. // in.setDevice(tcpSocket);
  29. // in.setVersion(QDataStream::Qt_4_0);
  30. // QPushButton *button = new QPushButton("Push");
  31. // parent->layout()->addWidget(button);
  32. // connect(button, &QPushButton::clicked, this, &Client::clicked);
  33. // connect(tcpSocket, &QIODevice::readyRead, this, &Client::readFortune);
  34. //}
  35. Client::Client(QWidget *parent, int count, char** arguments) : QDialog(parent), argc(count), argv(arguments), m_client_socket_fd(-1) {}
  36. void Client::handleMessages() {
  37. char receive_buffer[2048];
  38. for (;;) {
  39. memset(receive_buffer, 0, 2048);
  40. int bytes_received = 0;
  41. bytes_received = recv(m_client_socket_fd, receive_buffer, 2048 - 2, 0);
  42. receive_buffer[2047] = 0;
  43. if (bytes_received == 0) {
  44. break;
  45. }
  46. emit Client::messageReceived(QString::fromUtf8(receive_buffer, 2048));
  47. }
  48. memset(receive_buffer, 0, 2048);
  49. ::close(m_client_socket_fd);
  50. }
  51. int Client::start() {
  52. m_client_socket_fd = socket(AF_INET, SOCK_STREAM, 0);
  53. if (m_client_socket_fd != -1) {
  54. sockaddr_in server_socket;
  55. char* end;
  56. server_socket.sin_family = AF_INET;
  57. auto port_value = strtol(argv[2], &end, 10);
  58. if (port_value < 0 || end == argv[2]) {
  59. return 1;
  60. }
  61. int socket_option = 1;
  62. // Free up the port to begin listening again
  63. setsockopt(m_client_socket_fd, SOL_SOCKET, SO_REUSEADDR, &socket_option,
  64. sizeof(socket_option));
  65. server_socket.sin_port = htons(port_value);
  66. inet_pton(AF_INET, argv[1], &server_socket.sin_addr.s_addr);
  67. if (::connect(m_client_socket_fd, (sockaddr*)&server_socket,
  68. sizeof(server_socket)) != -1) {
  69. // std::thread t(handleMessages);
  70. } else {
  71. qDebug() << errno;
  72. ::close(m_client_socket_fd);
  73. }
  74. return 0;
  75. }
  76. }
  77. void Client::requestNewFortune() {
  78. QMessageBox::information(this, tr("Jigga Client"),
  79. tr("Gibs me dat fortune, punk!"));
  80. }
  81. void Client::sendMessage(const QString& s) {
  82. if (m_client_socket_fd != -1) {
  83. QByteArray byte_array = s.toLocal8Bit();
  84. ::send(m_client_socket_fd, byte_array.data(), byte_array.size(), 0);
  85. } else {
  86. qDebug() << "You must first open a connection";
  87. }
  88. }