Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2024, 15:19   #1
Ste11
Новичок
Джуниор
 
Регистрация: 24.11.2022
Сообщений: 3
По умолчанию Клиент-серверное приложение для линукс

Здравствуйте, хочу сделать сервис для сервера линукс, синхронизация файлов с сервером и всеми моими устройствами.

Посмотрев много видео и статей, понял что лучше использовать сокеты.

Сделал небольшой, самый простой чат на сокетах, чтобы понять как они работают в с++:
Серверная часть:
Код:
#include <iostream>
#include <string.h>
#include <cstdlib>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
 
#define ERROR_SERVER "SERVER ERROR: "
#define CLIENT_CLOSE_CONNECTION_SYMBOL '#'
#define DEFAULT_PORT 1612
#define BUFFER_SIZE 1024
 
bool is_client_connection_close(const char* msg);
 
using namespace std;
 
int main(int argc, char const* argv[]) {
    int client;
    int server;
 
    struct sockaddr_in server_address;
 
    client = socket(AF_INET, SOCK_STREAM, 0);
 
 
    if (client < 0) {
        std::cout << ERROR_SERVER << "CONNECT ESTABLISHING";
        exit(0);
    }
 
    std::cout << "SERVER: Socket created!\n";
 
    server_address.sin_port = htons(DEFAULT_PORT);
    server_address.sin_family = AF_INET;
    server_address.sin_addr.s_addr = htons(INADDR_ANY);
 
    int ret = bind(client, reinterpret_cast<struct sockaddr*>(&server_address), sizeof(server_address));
 
    if (ret < 0) {
        std::cout << ERROR_SERVER << "binding connection. Socket has already been been established.\n";
        return -1;
    }
 
    socklen_t size = sizeof(server_address);
 
 
    std::cout << "SERVER: " << "Listening clients...\n";
    listen(client, 1);
    server = accept(client, reinterpret_cast<struct sockaddr*>(&server_address), &size);
 
    if (server < 0) {
        std::cout << ERROR_SERVER << "Can't accepting client.\n";
    }
 
    char buffer[BUFFER_SIZE];
    bool is_exit = false;
 
 
    while (server > 0) {
        strcpy(buffer, "=>Server connected!\n");
        send(server, buffer, BUFFER_SIZE, 0);
        std::cout << "=> Connected to the client #1" << endl << "Enter" << CLIENT_CLOSE_CONNECTION_SYMBOL <<  " to end the connection\n\n";
 
        std::cout << "Client: ";
        recv(server, buffer, BUFFER_SIZE, 0);
 
        std::cout << buffer << endl;
 
        if (is_client_connection_close(buffer)) {
            is_exit = true;
        }
 
        while(!is_exit) {
            std::cout << "Server: ";
            std::cin.getline(buffer, BUFFER_SIZE);
            send(server, buffer, BUFFER_SIZE, 0);
            if (is_client_connection_close(buffer)) {
                break;
            }
 
            std::cout << "Client: ";
            recv(server, buffer, BUFFER_SIZE, 0);
            std::cout << buffer << endl;
            if (is_client_connection_close(buffer)) {
                break;
            }
        }
 
        std::cout << "\n GoodBye" << endl;
        is_exit = false;
        exit(1);
    }
    return 0;
}
 
bool is_client_connection_close(const char* msg) {
    for (int i = 0; i < strlen(msg); ++i) {
        if (msg[i] == CLIENT_CLOSE_CONNECTION_SYMBOL){
            return true;
        }
    }
    return false;
}
Собственно то всё работает, но вот я сейчас сделаю например, если я буду делать кросплатформенное приложение, то мне нужно будет сразу же запускать сокет на всех устройствах, а мой код только для одного потока. Как можно сделать многопоточный в данном случае чат, а в дальнейшем загрузку файлов, фото, видео на сервер?
Я делаю эту программу только для себя, так как мне не нравяться nextcloud и подобные. Помогите разобраться, пожалуйста! Как можно реализовать?
Ste11 вне форума Ответить с цитированием
Старый 02.02.2024, 18:33   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

https://man7.org/linux/man-pages/man2/select.2.html
waleri вне форума Ответить с цитированием
Старый 05.02.2024, 08:29   #3
Ste11
Новичок
Джуниор
 
Регистрация: 24.11.2022
Сообщений: 3
По умолчанию

waleri, это библиотека?
Ste11 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Клиент - серверное приложение Rusik. БД в Delphi 1 01.07.2020 08:52
Клиент-Серверное приложение...? spamer Общие вопросы по программированию, компьютерный форум 2 15.03.2012 12:42
Клиент-Серверное приложение.(WSA) Necare Работа с сетью в Delphi 8 28.02.2012 15:56
Возможно-ли Клиент-серверное приложение типа Клиент(Pascal) а сервер(CGI)? Demol Работа с сетью в Delphi 1 21.04.2009 16:18
Клиент-серверное приложение veryseldom Работа с сетью в Delphi 8 20.08.2007 19:57