Загрузка...

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

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

  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. Посмотреть предыдущие комментарии (5)
    2. lethe1337
      nsw, да, допустим тут. на самом деле без разницы где, как правило все объявления переменных в одном месте находятся. номера строк пишутся слева от пространства где у тебя код
      24 мар 2023 Изменено
    3. nsw Автор темы
      lethe1337, спс проблему решил
    4. nsw Автор темы
      lethe1337, но скрипт чет не рабоает
      24 мар 2023 Изменено
    5. Посмотреть следующие комментарии (8)
  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
Загрузка...