Загрузка...

Помогите решить проблему

Тема в разделе C/C++ создана пользователем nsw 23 мар 2023. 289 просмотров

  1. nsw
    nsw Автор темы 23 мар 2023 9 2 сен 2022
  2. kekch127
    kekch127 23 мар 2023 826 5 окт 2020
    ну написано, что у тебя не объявлен local_port
     
    1. Посмотреть предыдущие комментарии (1)
    2. kekch127
      nsw, объявить переменную -_-
    3. nsw Автор темы
    4. denisssss_inactive
      nsw, объявить переменную или спросить у chatgpt как будет корректно
  3. Narg
    Narg 23 мар 2023 СЛИВ СОНЬКИ - lolz.live/threads/8847519 7562 26 июл 2019
    У тебя там хуйня местами перепутана вроде
     
    1. Narg
      Narg, идентификатор не был объявлен, идентификатор написан с ошибками, заголовок, в котором объявлен идентификатор, не включен в файл, или в идентификаторе отсутствует квалификатор области, например, cout вместо std::cout
  4. lethe1337
    lethe1337 24 мар 2023 7 14 май 2020
    вообще на будущее - тыкаешь на код ошибки и у тебя отдельная страница от майков открывается
    тут у тебя переменной нет, она должна иметь тип uint16_t.
    например, объяви так

    C
    uint16_t local_port = 1337;
    источник
     
    24 мар 2023 Изменено
    1. Посмотреть предыдущие комментарии (13)
    2. lethe1337
      nsw, а ну вроде да это же из внешней библиотеки sockAddr. тогда хз гугли
    3. lethe1337
      nsw, не моя это тема, чем смог тем помог=)
    4. nsw Автор темы
      lethe1337, да нечего страшного ты мне помог решить проблему
  5. nsw
    nsw Автор темы 24 мар 2023 9 2 сен 2022
    C
    #include <iostream>
    #include <winsock2.h>
    #include <thread>

    #pragma comment(lib, "ws2_32.lib")

    void receive_data(SOCKET sock)
    {
    while (true) {
    char buffer[256];
    int recv_len = recv(sock, buffer, sizeof(buffer), 0);
    if (recv_len > 0) {
    buffer[recv_len] = '\0';
    std::cout << "Key pressed: " << buffer << std::endl;
    }
    }
    }

    int main(int argc, char* argv[])
    {
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);

    SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    sockaddr_in sockAddr;
    sockAddr.sin_family = AF_INET;
    sockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    sockAddr.sin_port = htons(local_port);
    bind(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));
    listen(sock, 1);

    SOCKET clientSock = accept(sock, nullptr, nullptr);

    std::thread receiver(receive_data, clientSock);

    receiver.join();

    closesocket(sock);
    closesocket(clientSock);
    WSACleanup();

    return 0;
    }
     
    24 мар 2023 Изменено
    1. ЮТУБ
      nsw, на первый взгляд, проблем в коде нет, но есть несколько моментов, которые можно улучшить


      необходимо добавить обработку ошибок для функций bind() и listen(), можно использовать макросы WSAGetLastError() и perror():

      Код
      if (bind(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
      perror("bind failed");
      closesocket(sock);
      WSACleanup();
      return 1;
      }

      if (listen(sock, 1) == SOCKET_ERROR) {
      perror("listen failed");
      closesocket(sock);
      WSACleanup();
      return 1;
      }
      в функции receive_data() нет обработки ошибок при вызове recv(). Если recv() завершается с ошибкой, программа может продолжить работу и неожиданно завершиться позже. думаю нужно проверить, что значение recv_len не равно SOCKET_ERROR и recv_len не равно 0. если recv_len равно SOCKET_ERROR, то необходимо обработать ошибку, например, закрыть сокеты и завершить программу
      Код
      int recv_len = recv(sock, buffer, sizeof(buffer), 0);
      if (recv_len == SOCKET_ERROR) {
      perror("recv failed");
      closesocket(sock);
      WSACleanup();
      return 1;
      } else if (recv_len == 0) {
      std::cout << "Connection closed" << std::endl;
      closesocket(sock);
      WSACleanup();
      return 0;
      } else {
      buffer[recv_len] = '\0';
      std::cout << "Key pressed: " << buffer << std::endl;
      }
      в текущей реализации поток receiver не останавливается, когда клиент закрывает соединение. Необходимо добавить проверку на завершение соединения и остановить поток, когда это происходит. это можно сделать, например, путем добавления проверки на значение recv_len в функцию receive_data():

      Код
      void receive_data(SOCKET sock)
      {
      while (true) {
      char buffer[256];
      int recv_len = recv(sock, buffer, sizeof(buffer), 0);
      if (recv_len == SOCKET_ERROR) {
      perror("recv failed");
      closesocket(sock);
      return;
      } else if (recv_len == 0) {
      std::cout << "Connection closed" << std::endl;
      closesocket(sock);
      return;
      } else {
      buffer[recv_len] = '\0';
      std::cout << "Key pressed: " << buffer << std::endl;
      }
      }
      }
  6. alman0003
    alman0003 27 мар 2023 4 28 окт 2019
    иди изучи фундамент языка сначала
     
  7. серек
    серек 27 мар 2023 5270 26 окт 2020
    неформал лучше к нему обратись
    он поможет полноценный проект сделать без единой дыры
     
    1. nsw Автор темы
      серек, это твой второй акк?
    2. p0bed1tel
      nsw, это его ферма
Загрузка...
Top