Ответы пользователя по тегу C++
  • Как правильно передавать данные через сокеты?

    @none7
    send и recv это функции работающие с бинарными данными. Для них очень важна корректная длина.
    send(newConnection, msg, sizeof(msg), NULL); sizeof это чисто сишная конструкция. В данном случае она возвращает 4 или 8 в зависимости от архитектуры машинного кода программы. То есть размер указателя.
    Ответ написан
    Комментировать
  • Как пользоваться функцией EnumWindows?

    @none7
    #include <Windows.h>
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    static BOOL CALLBACK enumWindowCallback(HWND func_hWnd, LPARAM lparam) {
        int length = GetWindowTextLengthA(func_hWnd);
    
        if (length != 0) {
            string windowTitle(length, '\0');
            GetWindowTextA(func_hWnd, windowTitle.data(), length + 1); // ANSI version and func_hWnd
            std::cout << func_hWnd << ":  " << windowTitle << std::endl;
        }
        return TRUE;
    }
    
    int main() {
        SetConsoleOutputCP(GetACP());
        EnumWindows((WNDENUMPROC)enumWindowCallback, 0);
        system("pause");
        return 0;
    }
    Ответ написан
    4 комментария
  • Есть ли функция валидации Ipv4 в C++?

    @none7
    А смысл его валидировать? Вот будет ваша программа принимать только 4 десятичных числа от 0 до 255 разделённых точкой, в то время как большая часть софта нормально переваривает и восьмеричные с шестнадцетеричными числами. И даже 0x7f000001 признаётся нормальным адресом. Всё эти программы пользуются функцией inet_aton, реализованной в каждой ОС. Но это чистый Си, не С++.
    Ответ написан
    Комментировать
  • Как вызвать CreateThread внутри Form?

    @none7
    Пример
    #include <Windows.h>
    
    DWORD WINAPI ThreadProc(LPVOID param); // строчка необходима, чтобы весь код выше реализации функции её видел
    public ref class Form1 : System::Windows::Forms::Form {
        System::Windows::Forms::Button^ button1;
        System::Windows::Forms::Label^ label1;
    
        void InitializeComponent() {
            this->button1 = gcnew System::Windows::Forms::Button();
            this->label1 = gcnew  System::Windows::Forms::Label();
            this->SuspendLayout();
    
            this->button1->Location = System::Drawing::Point(205, 95);
            this->button1->Name = "button1";
            this->button1->Size = System::Drawing::Size(75, 23);
            this->button1->TabIndex = 0;
            this->button1->Text = "button1";
            this->button1->UseVisualStyleBackColor = true;
    
            this->label1->AutoSize = true;
            this->label1->Location = System::Drawing::Point(218, 153);
            this->label1->Name = "label1";
            this->label1->Size = System::Drawing::Size(44, 16);
            this->label1->TabIndex = 1;
            this->label1->Text = "label1";
    
            this->AutoScaleDimensions = System::Drawing::SizeF(8.0, 16.0);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(485, 292);
            this->Controls->Add(this->label1);
            this->Controls->Add(this->button1);
            this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedSingle;
            this->MaximizeBox = false;
            this->Name = "Form1";
            this->Text = "Form1";
            this->ResumeLayout(false);
            this->PerformLayout();
        }
    public:
        static Form1^ myform;
        Form1() {
            InitializeComponent();
            myform = this;
            button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
        }
        void SetLabel(System::Int32 i) {
            label1->Text = i.ToString();
        }
    private:
        void button1_Click(System::Object^ sender, System::EventArgs^ e) {
            ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, NULL, 0, NULL);
        }
    };
    DWORD WINAPI ThreadProc(LPVOID param) {
        for (int i = 1; i <= 5; i++) {
            ::Sleep(1000);
            // Invoke вызывает указанный метод в потоке окна. MS не обещает синхронизацию
            // потоков для gui-кода. Если не использовать данный метод, то в худшем случае приложение
            // упадёт внутри небезопасных библиотек
            // то есть никаких нормальных исключений не будет. Только хардкорный SEH.
            Form1::myform->Invoke(gcnew System::Action<System::Int32>(Form1::myform, &Form1::SetLabel), i);
        }
        return 0;
    }
    int main(array<System::String^>^ args) {
        System::Windows::Forms::Application::EnableVisualStyles();
        System::Windows::Forms::Application::SetCompatibleTextRenderingDefault(false);
        System::Windows::Forms::Application::Run(gcnew Form1());
        return 0;
    }
    Ответ написан
  • Как через wininet делать несколько запросов в одном коннекте?

    @none7
    Вангую. Если сервер не закрыл подключение после выдачи контента, то HINTERNET полученный от HttpOpenRequest может быть использован для повторного вызова HttpOpenRequest. При этом HttpOpenRequest вернёт тот же HINTERNET. Не зря же они всё в один тип запихнули.
    Ответ написан
  • Как оптимизировать нагрузку на ЦП при отправке сообщения?

    @none7
    Действительно, почему же оно такое медленное? Может потому, что binary_t производит нечто подобное?
    {"bytes":[116,101,115,116],"subtype":null}.
    То есть происходит преобразование КАЖДОГО байта в десятичное число. Даже с применением несколько ускоренного алгоритма это всё занимает уйму процессорного времени.
    Ответ написан
    5 комментариев
  • Как применить на практике битовую операцию NOT?

    @none7
    s[i] = '0'+((~(s[i]-'0'))&1);
    Но NOT тут притянут за уши, все обычно используют XOR.
    *((*long long)s) ^= 0x0101010101010101LL;
    И никакого цикла не надо.
    Ответ написан
    Комментировать
  • Какая ошибка в коде?

    @none7
    int main() {
        const char* endl = "\r\n";
        WSADATA wsa;
    
        std::string domin;
        int status;
        std::string write_data;
    
        struct addrinfo hints = { 0 }, * res, * p;
        hints.ai_family = AF_UNSPEC;
        hints.ai_socktype = SOCK_STREAM;
    
        SetConsoleCP(GetACP());
        SetConsoleOutputCP(GetACP());
    
        if (status = WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {
            std::cout << "Error: of WSAStatus: " << gai_strerror(status) << std::endl;
            return status;
        }
    
        std::cout << "Enter domin: " << std::endl;
        std::getline(std::cin, domin);
    
        if (status = getaddrinfo(domin.c_str(), "80", &hints, &res) != 0) {
            std::cout << ("Error: of getaddrinfo", gai_strerror(status));
            return status;
        };
    
        {
            std::ostringstream ws;
    
            ws << "GET / HTTP/1.1" << endl;
            ws << "Host: " << domin << endl;
            ws << "Accept: text/html, text/*" << endl;
            ws << "Connection: close" << endl;
            ws << endl;
    
            write_data = ws.str();
        }
    
        std::cout << write_data;
    
        char ipstr[1024];
        int s = INVALID_SOCKET;
    
        char bufrecv[2048];
    
        for (p = res; p != NULL; p = p->ai_next) {
            const char* ipver;
            void* addr;
            if (p->ai_family == AF_INET) {
                struct sockaddr_in* ipv4 = (struct sockaddr_in*)p->ai_addr;
                addr = &(ipv4->sin_addr);
                ipver = "IPv4: ";
            }
            else {
                struct sockaddr_in6* ipv6 = (struct sockaddr_in6*)p->ai_addr;
                addr = &(ipv6->sin6_addr);
                ipver = "IPv6: ";
            }
    
            inet_ntop(p->ai_family, addr, ipstr, sizeof(ipstr));
            std::cout << "addres: " << ipver << ipstr << std::endl;
    
            if (s != INVALID_SOCKET) {
                shutdown(s, SD_BOTH);
                closesocket(s);
            }
    
            if (((s = socket(p->ai_family, p->ai_socktype, p->ai_protocol))) == INVALID_SOCKET) {
                std::cout << "error of socket: " << WSAGetLastError() << std::endl;
                continue;
            }
    
            if ((connect(s, p->ai_addr, p->ai_addrlen)) == SOCKET_ERROR) {
                std::cout << "Error of connect: " << WSAGetLastError() << std::endl;
                continue;
            }
    
            bool success = true;
            int writed = 0;
            for (size_t i = 0, data_len = write_data.length(); i < data_len; i += writed) {
                writed = send(s, write_data.c_str() + i, (int)min(data_len - i, INT_MAX), 0);
                if (writed == SOCKET_ERROR) {
                    std::cout << "Error of send: " << WSAGetLastError() << std::endl;
                    success = false;
                    break;
                }
            }
            if (success) {
                int readed;
    
                while ((readed = recv(s, bufrecv, sizeof(bufrecv), 0)) != SOCKET_ERROR && readed != 0) {
                    std::cout << std::string(bufrecv, readed);
                }
                if (readed == SOCKET_ERROR) {
                    std::cout << " recv " << WSAGetLastError() << std::endl;
                }
                break;
            }
        }
    
        if (s != INVALID_SOCKET)
        {
            shutdown(s, SD_BOTH);
            closesocket(s);
        }
    
        freeaddrinfo(res);
        WSACleanup();
        system("pause");
        return 0;
    }
    Ответ написан
    4 комментария
  • Что в коде нужно исправить что бы мне выводился на экран ip адрес?

    @none7
    #pragma comment (lib,"Ws2_32.lib")
    #include <winsock2.h>
    #include <WS2tcpip.h>
    #include <Windows.h>
    #include <iostream>
    #include <string>
    
    int main() {
        WSADATA wsa;
        std::string domain;
        int status;
        struct addrinfo hints = { 0 }, * res, * p;
        hints.ai_family = AF_UNSPEC;
        hints.ai_socktype = SOCK_STREAM;
    
        // ошибки выводятся в ANSI кодировке, а консоль по умолчанию в OEM
        SetConsoleCP(GetACP());
        SetConsoleOutputCP(GetACP());
    
        // На Windows необходима инициализация сетевой библиотеки
        if (status = WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {
            std::cout << "Error: of getaddrinfo: " << get_error_message(status) << std::endl;
            // принято возвращать причину ошибки, а не только сам факт
            return status;
        }
        std::cout << ("Enter domain: ");
        // даже доменные имена могут иметь длину 256 символов
        // пользователь же может вообще ввести сколько ему угодно
        std::getline(std::cin, domain);
    
        if (status = getaddrinfo(domain.c_str(), "80", &hints, &res) != 0) {
            std::cout << "Error: of getaddrinfo: " << get_error_message(status) << std::endl;
            return status;
        };
    
        char ipstr[INET6_ADDRSTRLEN];
    
        for (p = res; p != NULL; p = p->ai_next) {
            /*const char* ipver;*/
            void* addr;
            if (p->ai_family == AF_INET) {
                struct sockaddr_in* ipv4 = (struct sockaddr_in*)p->ai_addr;
                addr = &(ipv4->sin_addr);
                /*ipver = "IPv4:";*/
            }
            else {
                struct sockaddr_in6* ipv6 = (struct sockaddr_in6*)p->ai_addr;
                addr = &(ipv6->sin6_addr);
                /*ipver = "IPv6:";*/
            }
            inet_ntop(p->ai_family, addr, ipstr, sizeof(ipstr));
            std::cout << "addres: " << ipstr << std::endl;
        };
        freeaddrinfo(res);
        system("pause");
        // деструктор сетевой библиотеки
        WSACleanup();
        return 0;
    }
    Ответ написан
    Комментировать
  • Как мне импортировать методы класса при компиляции dll С++11?

    @none7
    Почему при работе с процедурами Вы положили в .h файл только декларацию функции, а в случае с классами запихнули всю реализацию? Нужно отделять мух от котлет. Методы можно реализовать и отдельно от объявления класса, если указывать их полное имя, например
    // xyz.h
    class xyz
    {
    private:
      int abc;
    public:
      PROJECT2_API int printing_int();
    };
    //xyz.cpp
    PROJECT2_API int hyz::printing_int() { // return 5
        return abc;
    }


    P.S. Мне очень интересно как Ваш код будет работать в вот таком случае.
    void printing(char* pChar) {
      char a[] = "Example String";
      strcpy_s(pChar, strlen(a) + 1, a);
    }
    int main() {
      char[4] buff = {0};
      printing(buff);
      printf("%s\n", buff);
    }
    Ответ написан
    4 комментария
  • Как исправить ошибку "Buffer is too small" C++?

    @none7
    Ошибка в том, что все сишные строки они null-termanated и strlen этот '\0' не учитывает при подсчёте длины строки. В первой строке оно работает по ошибке, так как не должно быть там strlen(space). Вообще это совершенно дурной способ использования функции strcat_s, ведь второй параметр это не длина копируемой строки, а максимально возможная длина буфера, который 80 байт. В таком виде очень даже возможно переполнение буфера.
    Ответ написан
  • WinForm | Как записать текст из textBox в файл?

    @none7
    std::string ToCppString(String^ s, Text::Encoding^ enc = Text::Encoding::ASCII) {
        array<unsigned char>^ chars = enc->GetBytes(s);
        pin_ptr<unsigned char> pp = &chars[0];
        char *first = (char*)pp, *last = first + chars->Length;
        return std::string(first, last);
    }
    Ответ написан
  • Как вынуть публичный ключ из сертификата, для дальнейшей подписи и шифрования данных через библиотеку CryptoAPI?

    @none7
    По идее токен это не просто флешка. Вытащить секретный ключ из него должно быть невозможно. Следовательно Вам копать в сторону PKCS7 и функций
    CryptSignMessage
    CRYPT_SIGN_MESSAGE_PARA
    CERT_CONTEXT
    CertEnumCertificatesInStore
    CertOpenStore
    и т.д.
    P.S. примера кода не дам.
    Ответ написан
    Комментировать
  • C++ как преобразовать string в bitset?

    @none7
    template <class _Elem = char, class _Traits = char_traits<_Elem>, class _Alloc = allocator<_Elem>>
    std::string getstrbits(const std::basic_string<_Elem, _Traits, _Alloc>& s) {
        std::stringstream ret;
        const constexpr int digits = std::numeric_limits<_Elem>::digits + std::numeric_limits<_Elem>::is_signed;
        for (auto c : s) ret << std::bitset<digits>(c).to_string();
        return ret.str();
    }
    Пропускаешь строчку через функцию, а затем скармливаешь bitset. Только нужно понимать, что bitset это массив фиксированного размера, а string динамического.
    Ответ написан
    Комментировать
  • Почему выбрасывает ошибку при компилировании?

    @none7
    Вы объявили функцию accept2 внутри функции main. Так делать нельзя.
    Ответ написан
    Комментировать
  • Как заставить работать код C++ правильно?

    @none7
    Могу предположить, что cin >> K[i].year; не читает завершение строки(ведь они не число) и оно прилетает на ввод следующего имени. Вообще в нынешнем с++ использование указателей и неуправляемых массивов — ересь.
    #include <windows.h>
    #include <iostream>
    #include <vector>
    #include <string>
    #include <sstream>
    #include <algorithm>
    #include <ctime>
    
    using namespace std;
    
    const int UserCount = 3;
    struct Worker { // начало объявления структурного типа Worker
        string surname; //объявление поля «фамилия работника»
        string position; //объявление поля «название занимаемой должности»
        unsigned short int year; //объявление поля «год поступления на работу»
    
        static bool insensitive_compare(const Worker& a, const Worker& b)
        {
            string ta(a.surname), tb(b.surname);
            transform(ta.begin(), ta.end(), ta.begin(), [](unsigned char c) { return std::toupper(c); });
            transform(tb.begin(), tb.end(), tb.begin(), [](unsigned char c) { return std::toupper(c); });
            return ta < tb;
        }
    }; //конец объявление структуры Worker
    
    template<class T> void getline_i(istream& is, T& o)
    {
        string s;
        while (true)
        {
            getline(is, s);
            stringstream(s) >> o;
    
            if (s.length() < 1 || !isdigit(s[0]))
            {
                cout << "Ошибка. Значение должно быть числом: ";
                continue;
            }
            else
            {
                break;
            }
        }
    }
    
    int main()
    {
        system("chcp 1251");
        int n = 3; // объявление константы n — числа элементов типа «Worker»
    
        bool people = false;
    
        time_t rawtime;
        struct tm _tm;
    
        time(&rawtime);
        gmtime_s(&_tm, &rawtime);
        unsigned short int now_year = _tm.tm_year + 1900, seniority; // объявление переменных now_year — текущий год и seniority — стаж
        vector<Worker> K;
        Worker temp;
    
        for (int i = 0; i < UserCount; i++)
        {
            cout << "Фамилия и инициалы: ";
            getline(cin, temp.surname);
    
            cout << "Название занимаемой должности: ";
            getline(cin, temp.position);
    
            cout << "Год поступления на работу: ";
            getline_i(cin, temp.year);
    
            cout << "\n";
            K.push_back(temp);
        }
    
        cout << "Введите стаж работы(лет): ";
        getline_i(cin, seniority);
    
        cout << endl;
    
        for (auto current : K)
        {
            if ((now_year - current.year) > seniority)
            {
                cout << current.surname << endl;
                people = true;
            }
        }
    
        if (people == false) 
            cout << "Нет таких работников!" << endl;
    
        cout << endl;
        cout << "Список работников в алфавитном порядке" << endl;
    
        sort(K.begin(), K.end(), Worker::insensitive_compare);
    
        for (auto current : K)
            cout << current.surname << endl;
    
        system("pause");
        return 0;
    }
    Ответ написан
    Комментировать
  • Кирилица в c++, как работать с wstring?

    @none7
    locale::global(locale(".866", locale::all));
    На VS19+Win10 работать должно, где то ещё почти наверняка нет.
    Ответ написан
    Комментировать
  • Как правильно оформить inline вставку ассемблера в отдельный код для MASM?

    @none7
    На x64 под виндой эта функция лишена смысла, поскольку стандартное соглашение вызовов не предполагает смещения стека для передачи параметров. Независимо от флагов stdcall/cdecl, компилятор использует fastcall.
    Ответ написан
  • Задать переменной значение из txt?

    @none7
    Так и должно быть. Если Вы хотите прочитать весь файл в строку, то смотрите пример.
    Ответ написан
    Комментировать