Skip to content
Open
57 changes: 57 additions & 0 deletions KromachevMaxim/.gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,60 @@
lab1.pro.user
CMakeLists.txt.user
build_lab1
build
*~
*.autosave
*.a
*.core
*.moc
*.o
*.obj
*.orig
*.rej
*.so
*.so.*
*_pch.h.cpp
*_resource.rc
*.qm
.#*
*.*#
core
!core/
tags
.DS_Store
.directory
*.debug
Makefile*
*.prl
*.app
moc_*.cpp
ui_*.h
qrc_*.cpp
Thumbs.db
*.res
*.rc
/.qmake.cache
/.qmake.stash
*.pro.user*
*.flc
.*.swp
*.ib_pdb_index
*.idb
*.ilk
*.pdb
*.sln
*.suo
*.vcproj
*vcproj.*.*.user
*.ncb
*.sdf
*.opensdf
*.vcxproj
*vcxproj.*
*.Debug
*.Release
*.pyc
*.dll
*.exe
CMakeLists.txt.user
QtCreatorDeployment.txt
57 changes: 57 additions & 0 deletions KromachevMaxim/lab2/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
cmake_minimum_required(VERSION 3.14)

project(local_chat)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror")

find_package(Qt6 REQUIRED COMPONENTS Widgets)

set(FIFO_FILES
src/host_fifo.cpp
src/client_fifo.cpp
src/conn_fifo.cpp
)

set(SOCKET_FILES
src/host_socket.cpp
src/client_socket.cpp
src/conn_socket.cpp
)

set(PIPE_FILES
src/host_pipe.cpp
src/client_pipe.cpp
src/conn_pipe.cpp
)

set(GUI_FILES
src/host_window.cpp
src/client_window.cpp
src/input_dialog.cpp
)

add_executable(conn_fifo
${FIFO_FILES}
${GUI_FILES}
)

add_executable(conn_socket
${SOCKET_FILES}
${GUI_FILES}
)

add_executable(conn_pipe
${PIPE_FILES}
${GUI_FILES}
)

target_link_libraries(conn_fifo PRIVATE Qt6::Widgets)
target_link_libraries(conn_socket PRIVATE Qt6::Widgets)
target_link_libraries(conn_pipe PRIVATE Qt6::Widgets)
39 changes: 39 additions & 0 deletions KromachevMaxim/lab2/bash.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#!/bin/bash

set -e

build_dir="build"
fifo="conn_fifo"
socket="conn_socket"
pipe="conn_pipe"

if ! command -v cmake &> /dev/null; then
echo "CMake не установлен."
exit 1
fi

echo "CMake уже установлен. Версия:"
cmake --version

echo "Очистка старых файлов..."
rm -rf $build_dir $fifo $socket $pipe

echo "Создание директории сборки..."
mkdir $build_dir

cd $build_dir

echo "Запуск cmake..."
cmake .. -DCMAKE_C_FLAGS="-Wall -Werror" -DCMAKE_CXX_FLAGS="-Wall -Werror"

echo "Запуск make..."
make

echo "Сборка завершена успешно."

cp $fifo ../
cp $socket ../
cp $pipe ../

echo "Удаление директории сборки..."
cd .. && rm -rf $build_dir
130 changes: 130 additions & 0 deletions KromachevMaxim/lab2/src/client_fifo.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
#include "client_window.h"
#include "conn_fifo.h"

void ClientChatWindow::setup_conn()
{
std::string send_private_chat = "/tmp/client_host_private_fifo" + std::to_string(getpid());
std::string read_private_chat = "/tmp/host_client_private_fifo" + std::to_string(getpid());

private_conn.first = std::make_unique<ConnFifo>(send_private_chat, false);
private_conn.second = std::make_unique<ConnFifo>(read_private_chat, false);

std::string send_public_chat = "/tmp/client_host_public_fifo" + std::to_string(getpid());
std::string read_public_chat = "/tmp/host_client_public_fifo" + std::to_string(getpid());

public_conn.first = std::make_unique<ConnFifo>(send_public_chat, false);
public_conn.second = std::make_unique<ConnFifo>(read_public_chat, false);

QTimer *timer = new QTimer(this);

connect(timer, &QTimer::timeout, [this, timer]()
{
if (setup_count < 10)
{
if (!public_conn.first->is_valid())
{
public_conn.first->setup_conn(false);
}

if (!public_conn.second->is_valid())
{
public_conn.second->setup_conn(false);
}

if (!private_conn.first->is_valid())
{
private_conn.first->setup_conn(false);
}

if (!private_conn.second->is_valid())
{
private_conn.second->setup_conn(false);
}

if (public_conn.first->is_valid() && public_conn.second->is_valid()
&& private_conn.first->is_valid() && private_conn.second->is_valid()) {
timer->stop();
return;
}

++setup_count;
} else
{
timer->stop();
QMessageBox::critical(this, "Ошибка", "Ошибка открытия общего fifo канала.");
}
});

timer->start(1000);
}

void ClientChatWindow::send_public_msg(const std::string& msg)
{
if(msg.empty())
{
QMessageBox::warning(this, "Warning", "Cannot send an empty message.");
return;
}

if(public_conn.first && public_conn.first->is_valid())
{
if(!public_conn.first->write(msg))
{
QMessageBox::critical(this, "Error", "Failed to send message.");
return;
}
}

public_chat.append_msg("snd: " + msg);
}

void ClientChatWindow::send_private_msg(const std::string& msg)
{
if(msg.empty())
{
QMessageBox::warning(this, "Warning", "Cannot send an empty message.");
return;
}

if(private_conn.first && private_conn.first->is_valid())
{
if(!private_conn.first->write(msg))
{
QMessageBox::critical(this, "Error", "Failed to send message.");
return;
}
}

private_chat.append_msg("snd: " + msg);
}

void ClientChatWindow::read_msg()
{
if(public_conn.second->is_valid())
{
std::string msg;
const unsigned max_size = 1024;
if(public_conn.second->read(msg, max_size))
{
if(!msg.empty())
{
public_chat.append_msg("rcv: " + msg);
}
}
}

if(private_conn.second->is_valid())
{
std::string msg;
const unsigned max_size = 1024;
if(private_conn.second->read(msg, max_size))
{
if(!msg.empty())
{
private_chat.append_msg("rcv: " + msg);
}
}
}
}


82 changes: 82 additions & 0 deletions KromachevMaxim/lab2/src/client_pipe.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
#include "client_window.h"
#include "conn_pipe.h"

void ClientChatWindow::setup_conn()
{
public_conn.first = std::make_unique<ConnPipe>(*((int*)reserve));
public_conn.second = std::make_unique<ConnPipe>(*((int*)reserve + 1));

private_conn.first = std::make_unique<ConnPipe>(*((int*)reserve + 2));
private_conn.second = std::make_unique<ConnPipe>(*((int*)reserve + 3));
}

void ClientChatWindow::send_public_msg(const std::string& msg)
{
if(msg.empty())
{
QMessageBox::warning(this, "Warning", "Cannot send an empty message.");
return;
}

if(public_conn.first && public_conn.first->is_valid())
{
if(!public_conn.first->write(msg))
{
QMessageBox::critical(this, "Error", "Failed to send message.");
return;
}
}

public_chat.append_msg("snd: " + msg);
}

void ClientChatWindow::send_private_msg(const std::string& msg)
{
if(msg.empty())
{
QMessageBox::warning(this, "Warning", "Cannot send an empty message.");
return;
}

if(private_conn.first && private_conn.first->is_valid())
{
if(!private_conn.first->write(msg))
{
QMessageBox::critical(this, "Error", "Failed to send message.");
return;
}
}

private_chat.append_msg("snd: " + msg);
}

void ClientChatWindow::read_msg()
{
if(public_conn.second->is_valid())
{
std::string msg;
const unsigned max_size = 1024;
if(public_conn.second->read(msg, max_size))
{
if(!msg.empty())
{
public_chat.append_msg("rcv: " + msg);
}
}
}

if(private_conn.second->is_valid())
{
std::string msg;
const unsigned max_size = 1024;
if(private_conn.second->read(msg, max_size))
{
if(!msg.empty())
{
private_chat.append_msg("rcv: " + msg);
}
}
}
}


Loading