rafamont
@rafamont
Junior BackEnd

Как изменить кодировку,что не так?

Здравствуйте, сделал небольшую программу для чатинга.
Вот код сервера программы:
#pragma comment(lib, "Ws2_32.lib")
#include<WinSock2.h>
#include<iostream>
#include<Ws2tcpip.h>
#include<ctime>

SOCKET Connect;
SOCKET* Connections;
SOCKET Listen;

int ClientCount = 0;

void SendMessageToClient(int ID) {
	char* buffer = new char[1024];
	for (;; Sleep(75)) {
		memset(buffer, 0, sizeof(buffer));
		if (recv( Connections[ID], buffer, 1024, NULL)) {
			printf(buffer);
			printf("\n");
			for (int i = 0; i <= ClientCount; i++) {
				send(Connections[i], buffer, strlen(buffer), NULL);
			}
		}
	}
	delete buffer;
}

int main() {
	setlocale(LC_ALL, "russian");
	WSAData data;
	WORD version = MAKEWORD(2, 2);
	int res = WSAStartup(version, &data);
	if (res != 0) {
		return 0;
	}

	struct addrinfo hints;
	struct addrinfo * result;

	Connections = (SOCKET*)calloc(64, sizeof(SOCKET));

	ZeroMemory(&hints, sizeof(hints));

	hints.ai_family = AF_INET;
	hints.ai_flags = AI_PASSIVE;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_protocol = IPPROTO_TCP;

	getaddrinfo(NULL, "7770", &hints, &result);

	Listen = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
	bind(Listen, result->ai_addr, result->ai_addrlen);
	listen(Listen, SOMAXCONN);

	freeaddrinfo(result);

	printf("Start server....");
	char m_connect[] = "Connect...;;;5";
	for (;; Sleep(75)) {
		if (Connect = accept(Listen, NULL, NULL)) {
			printf("Client connect...\n");
			Connections[ClientCount] = Connect;
			send(Connections[ClientCount], m_connect, strlen(m_connect), NULL);
			ClientCount++;
			CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)SendMessageToClient, (LPVOID)(ClientCount - 1), NULL, NULL);
		}
	}
	return 1;
}

5a62202a11f48898933993.jpeg
1). - Обратите внимание на консоль: что не так с текстом? Как изменить кодировку текста(код выше).
2). - Возможно ли скрыть процесс консоли и сделать её невидимой? Если да то киньте код как такое можно реализовать

Заранее спасибо)
  • Вопрос задан
  • 439 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Mercury13
Программист на «си с крестами» и не только
#include <iostream>
#include <windows.h>
#include <io.h>
#include <fcntl.h>

int main()     // wmain, получается, не обязателен
{
    std::wstring s = L"Тут курят! Błąd, kurwa!";
    // Проверка на юникодность. Если вышла бурда — такой компилятор фтопку!
    MessageBoxW(0, s.c_str(), L"Test", MB_OK);

    // Вот что надо сделать — так что не забывайте, что придётся работать не в UTF-8, а в wchar’ах
    _setmode(_fileno(stdout), _O_U16TEXT);
    std::wcout << s << std::endl;

    // Задержка
    std::cin.ignore(1);
    return 0;
}


Проверено на MinGW.

Со вторым вопросом — «возможно ли скрыть процесс консоли и сделать её невидимой» — ответ прост. В настройках проекта отключить производство консольной программы. У меня в Qt Creator в команде CONFIG += console c++11 пришлось убрать слово console. Желательно (но не обязательно) перейти с точку входа
int main()
на особую Windows-специфичную
int wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd)

Что нужно сделать в проекте — читайте доку.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы