LINUX.ORG.RU

Сообщения BladzheR

 

Linux не запускается. SuperBlock?!

Форум — General

Orange Pi; Armbian; microSD card;

Сначала перестал входить в phpmyadmin по удалёнке, потом в консоли началась какая-то ерунда, я сделал reboot и система перестала загружаться.
Вставил microSD в компьютер, раздел монтируется, все файлы на месте.

В интернете нашёл варианты с fsck, не помогло, так же нашел резервные супер блоки и попытался их заменить, не помогло. Пишет, что файловая система еще содержит ошибки. Изначально хотел зайти через chroot, но не поддерживается, да и не знаю поможет ли это.

Вопрос: возможно ли, восстановить систему?
Поскольку на ней mysql, phpmyadmin с настройками и другие пакеты, различные настройки: ssh, UART, fstab, автозапуска.
У меня есть еще одна новая microSD карта, может возможно перенести систему или же хотя бы перенести БД и настройки пакетов?

Фото ошибки.

 , , ,

BladzheR
()

Слетели зависимости. Как восстановить?

Форум — General

Вчера установили Opera через dpkg. Сказали, что там были какие-то зависимости, но всё как-то само решилось и установились.

Сегодня запустил систему, запустил команды обновления системы и мне выдало over9000 зависимостей.

Linux STRELKA-ElementaryOS 4.4.0-77-generic #98-Ubuntu SMP Wed Apr 26 08:34:02 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

Ответы терминала: install -f https://pastebin.com/S88x66nX dist-upgrade: https://pastebin.com/hRrhqY3M

Возможно ли это как-то исправить? Есть backup, но пока не решаюсь восстанавливать, поскольку он 2-х месячной давности и еще много чего устанавливать придётся, может быть можно какие-то определенные файлы восстановить из backup? С таким еще ни разу не сталкивался.

P.S. ... обновлено 0, установлено 796 новых пакетов, для удаления отмечено 755 пакетов, и 0 пакетов не обновлено. Необходимо скачать 338 MБ архивов. После данной операции, объём занятого дискового пространства уменьшится на 36,9 GB. То, что вы хотите сделать, может иметь нежелательные последствия. Чтобы продолжить, введите фразу: «Да, делать, как я скажу!»

 , , , ,

BladzheR
()

Python парсинг <yandex:full-text>

Форум — Development

Доброго вечера! Столкнулся с проблемой, как парсить <yandex:full-text> ?

d = feedparser.parse(link)
        for e in d.entries:
           print e.link
           print e.yandex:full-text #такой вариант естественно не работает

Какие есть варианты/предложения?

 , , ,

BladzheR
()

Как реализовано уведомление о новых обновлениях Linux?

Форум — Admin

Кто знает как реализовано уведомление о новых обновлениях(см.скриншот по ссылке)? скриншот OS Armbian. Хочу написать скрипт, чтобы он мне писал, когда есть обновления.

 , , , ,

BladzheR
()

Вывести список подкл. устр. к роутеру и процент нагрузки процессора

Форум — Admin

Хотел бы реализовать две вещи: Вывести список подключенных в данный момент устройств к роутеру и нагрузку на процессор роутера, к примеру в файл.

Если зайти в интерфейс роутера ASUS rt-n56u, то на главной страницы есть кнопка «Status», где отображается нагрузка на процессор в %, также есть кнопка «Клиенты», где отображаются все подключенные активные устройства.

Пытался через telnet найти файлы, думал, мало ли там где-то может храниться эта информация, но ничего пока не нашёл. Нашел только подкл. usb устройства. Либо может возможно написать какой-нибудь скрипт, чтобы изъять данную информацию с интерфейса.

 , , , ,

BladzheR
()

ПК сам включается, секунд через 10, после отключения.

Форум — General

Добрый день! Компьютер включается сам, секунд через 10, после отключения. Отключал через оболочку и через терминал init 0. В чем может быть проблема и как её возможно решить?

 , , ,

BladzheR
()

Мониторинг роутера

Форум — Admin

Доброй ночи! Интересует вопрос мониторинга роутера Asus RT-N56U. Нашел варианты через SNMP, но в данном роутере он отсутствует. В самом интерфейсе роутера я нашел различные графики и системный журнал. Есть какие-нибудь другие варианты мониторинга, помимо SNMP? Или как возможно вывести системный журнал? Планирую сделать мониторинг через conky или хотя бы вывод информации в файл.

 , , , ,

BladzheR
()

Как правильно/лучше разбить жесткий диск на несколько OC?

Форум — Linux-install

Здравствуйте! Есть диск на 500гб. Не подскажите как его лучше разбить? Хотелось бы чтобы было три OC: windows (C (для системы) и D(для остального)), Linux Mint с отдельным home, Kali Linux можно с отдельный home или без него.

Нужно ли будет создавать раздел на 100мб для windows?Или можно без него обойтись? Необходимо создавать два swap раздела или одного хватит?

 , , , ,

BladzheR
()

После действий с разделами,HDD не запускается...

Форум — Linux-hardware

Добрый день! Установил Linux, слетел загрузчик windows... Сделал команду bootrec.exe /fixboot, ноутбук завис и висел больше часа... Я его выключил и теперь ноутбук зависает на заставке bios. Подкл. диск к ПК, запустил livecd и вот какую картину я увидел: скриншот http://i080.radikal.ru/1504/4c/f3c0e542cb12.jpg Множество разделов от 100 до 255 по 32gb. Возможно ли это как-то исправить? И что вообще могло произойти?

 , , ,

BladzheR
()

Пропали звуковые устройства в разделе «Звук».

Форум — General

Добрый день! Пропали звуковые устройства «Выход» и «Вход», скорее всего после действий с pulseaudio. Различные действия из гугла не помогли... Скриншот: http://s61.radikal.ru/i171/1503/4b/54aa8498e3a5.jpg

 , , ,

BladzheR
()

Linux говорит,что печать завершена,а принтер не печатает.

Форум — General

Здравствуйте! При попытке что-нибудь распечатать, linux mint выдаёт уведомления,что «Печать такого то документа», после на экране принтера появляется надпись «Идёт обработка ... Пожалуйста подождите», далее фактически одновременно появляется уведомление «Печать завершена», а на экране принтера появляется главное меню.Ничего не распечатано... Через windows все печатает. Принтер Canon MG6340,подкл. патч-кордом в роутер. Подскажите,как возможно это исправить?

 , , ,

BladzheR
()

Grub на cd диск/флешку, чтобы быстро переустановить grub ...

Форум — Linux-install

Переодически слетает grub, помогает переустановка через livecd. Возможно ли сделать диск/флешку в которой будет только grub?чтобы быстро загрузил, переустановил... Через livecd долго ...

 , ,

BladzheR
()

HDD USB 3.0 перестали монтироваться.

Форум — General

Добрый день! Есть внешние HDD usb 2.0 и 3.0. OC Linux Mint 17.1. Сегодня столкнулся с проблемой,просто ни с того ни с сего ,диски usb 3.0 перестали монтироваться. В разделе «Диски» их тоже нет. Что могло произойти и как возможно устранить данную проблему?

 , , , ,

BladzheR
()

Recv снова в ожидании,в то время как Send уже все передал.

Форум — Development

Доброе утро! Столкнулся с проблемой: через отладчик gdb посмотрел,что функция recv получает данные и далее снова в ожидании получения данных,в то время как send уже передал данные и завершил работу. Возможно, что-то упустил ...

Куски кода: Server.c


int sendall(int s, char *buf, int len, int flags)
{
    int total = 0;
    int n = 0;
    while(total < len)
    {
        n = (int) send(s, buf+total, (size_t) (len-total), flags);
        if(n == -1) break;
        total += n;
    }
    return (n==-1 ? -1 : total);
}
//Если вместо sendall использовать send - проблема актуальна.
int fileTransferSend(int sock, char pathToFile[]){

    FILE *f;
    if (!(f = fopen(pathToFile, "rb"))) {
        perror("fopen");
        return 1;
    }
    fseek(f, 0, SEEK_END);
    int fsize = (int) ftell(f);
    rewind(f);

    char buffer[BUF_SIZE];
    long sended = 0, readed = 0;
    do {
        readed = fread(buffer, 1, BUF_SIZE, f);

        if ((sendall(sock, buffer, (int) readed, 0)) < 0) {
            perror("send[7]");
        }
        sended += readed;
    } while (sended != fsize);

    fclose(f);

    return 0;
}

Client.c

( читать дальше... )

 , , ,

BladzheR
()

Аналог MS access для linux?

Форум — Development

Добрый день! Есть база данных MS Access с расширением (.mdb). Возможно ли продолжить работу с ней под Linux(без Wine)? В libreoffice base не получилось открыть. Kexi криво установился ...

 , ,

BladzheR
()

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

Форум — Development

Добрый день! Есть проект на СИ,использую систему контроля версий. Столкнулся с проблемой: на одном пк у меня путь к каталогу:

#define pathToFolers "/home/user0/projects/name_prjct/"

а на другом пк:

#define pathToFolers "/home/user1/projects/name_prjct/"

Вопрос: возможно ли сделать так,чтобы не приходилось каждый раз менять имя пользователя в пути к каталогу в зависимости от того за каким пк я в данный момент работаю?

 , , ,

BladzheR
()

Система обмена файлами.Сокеты,linux.

Форум — Development

Здравствуйте! У меня есть проект «Система обмена файлами».

Задание: разработать приложение-клиент и приложение сервер, обеспечивающие функции обмена файлами.

Клиент может:

  • Получить список файлов хранящихся на сервере.
  • Добавить файл.
  • Удалить файл.
  • Скачать файл.
  • Отключиться от сервера.
  • Отключить сервер и сам отключиться.

Сервер:

  • Обновляет и отправляет список файлов клиенту.
  • Получает файл в папку files сервера.
  • Получает номер файла для удаления из папки files.
  • Отправляет файл клиенту
  • Пишем сообщение,что клиент отключился.
  • Завершаем работу сервера

Листинг Сервер:

/*  HELP:
..Server:
.........path: /home/bladzher/projects/[CLion]/FileTransferSystem/trunk/server
.........gcc server.c -o server
..Client
.........path: /home/bladzher/projects/[CLion]/FileTransferSystem/trunk/client
.........gcc client.c -o client
*******************************************************************************
*
* PATH files:
* ...........PC name: /ksergey/
* ...........Ultrabook name: /bladzher/
*
*******************************************************************************
 */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <time.h>
#include <string.h>
#include "dirent.h"

#define BUF_SIZE 1024
#define TEXT "Вы успешно подключились к системе передачи файлов!\n\nМЕНЮ:\n1)Отобразить список файлов.\n2)Добавить файл.\n3)Удалить файл.\n4)Скачать файл.\n5)Выход.\n6)Выключить сервер.\n"

char message1[1];
char buf1[sizeof(message1)];

int main() {
    int sock, listener;      // дескрипторы сокетов
    struct sockaddr_in addr; // структура с адресом
    char buf;          // буфер для приема
    int bytes_read;              // кол-во принятых байт

    listener = socket(AF_INET, SOCK_STREAM, 0); // создаем сокет для входных подключений
    if (listener < 0) {
        perror("socket");
        exit(1);
    }

    // Указываем параметры сервера
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    if (bind(listener, (struct sockaddr *) &addr, sizeof(addr)) < 0) // связываемся с сетевым устройство. Сейчас это устройство lo - "петля", которое используется для отладки сетевых приложений
    {
        perror("bind");
        exit(2);
    }

    listen(listener, 1); // очередь входных подключений

    int number, *ptn;
    number = 0;
    ptn = &number;

    int number1, *ptn1;
    number1 = 0;
    ptn1 = &number1;

    printf("\nОжидание подключения:\n");
    while (1) {
        sock = accept(listener, NULL, NULL); // принимаем входные подключение и создаем отделный сокет для каждого нового подключившегося клиента
        if (sock < 0) {
            perror("accept");
            exit(3);
        }
        char text[] = TEXT;
        send(sock, text, sizeof(text), 0);

        printf("К серверу подключился клиент!Ожидаем команду:\n");
        recv(sock, (void *) &number, 4, 0);
        printf("Получена команда от клиента: %d\n", *ptn);
        send(sock, "Сервер получил сообщение!", sizeof("Сервер получил сообщение!"), 0);

/*        ///Информация о файле
//        char *date;
//        int ret;
//        struct stat buf1;
//        if((ret = stat("/home/bladzher/projects/[CLion]/FileTransferSystem/trunk/server/files/Дима_Пряхин-новая_религия.mp3", &buf1)) !=0)
//        {
//            fprintf(stderr, "stat failure error .%d", ret);
//            abort();
//        }
//        date = asctime(localtime((time_t const *) &buf1.st_ctim));
//        printf("\n %s\n", date);
//        printf("\n %d mode\n", buf1.st_mode);
//        printf("\n %ld size\n", buf1.st_size);
        //Конец_Информация о файле*/

        if (*ptn == 1) {
            DIR *dir;
            struct dirent *entry;

            dir = opendir("/home/bladzher/projects/[CLion]/FileTransferSystem/trunk/server/files");
            if (!dir) {
                perror("diropen");
                close(sock);
                exit(4);
            }

            FILE *fo;
            if (!(fo = fopen("/home/bladzher/projects/[CLion]/FileTransferSystem/trunk/server/list.xml", "wt"))) {
                perror("fopen");
                close(sock);
                exit(6);
            }
            int i = 0;
            while ((entry = readdir(dir)) != NULL) {

                fprintf(fo, "%d)%s\n", i, entry->d_name);
                printf("%d)%s\n", i, entry->d_name);
                i++;
            }

            send(sock, entry, sizeof(entry), 0);
            closedir(dir);
            fclose(fo);

            FILE *f;
            if (!(f = fopen("/home/bladzher/projects/[CLion]/FileTransferSystem/trunk/server/list.xml", "rb"))) {
                perror("fopen");
                close(sock);
                exit(7);
            }
            fseek(f, 0, SEEK_END);
            int fsize = (int) ftell(f);
            rewind(f);

            long sended = 0;
            long readed = 0;

            char buffer[BUF_SIZE];
            do {
                readed = fread(buffer, 1, BUF_SIZE, f);
                send(sock, buffer, (size_t) readed, 0);
                sended += readed;
            } while (sended != fsize);
            fclose(f);

        }
        else if (*ptn == 2) {
            //Получаем имя и расширение файла
            //Получаем файл и добавляем его в папку files сервера.
            //Пишем клиенту,что файл успешно добавлен или иное.
        }
        else if (*ptn == 3) {

            recv(sock, (void *) &number1, 4, 0);
            printf("Получен номер файла для удаления: %d\n", *ptn1);
            //определяем имя и расширение файла
            //удаляет данный файл
            send(sock, "Сервер удалил файл!", sizeof("Сервер удалил файл!"), 0);

        }
        else if (*ptn == 4) {                                     //Передача файла
            FILE *f;
            if (!(f = fopen("/home/bladzher/projects/[CLion]/FileTransferSystem/trunk/server/files/Дима_Пряхин-новая_религия.mp3", "rb"))) {
                perror("fopen");
                close(sock);
                exit(8);
            }
            fseek(f, 0, SEEK_END);
            int fsize1 = (int) ftell(f);
            rewind(f);

            long sended1 = 0;
            long readed1 = 0;

            char buffer[BUF_SIZE];
            do {
                readed1 = fread(buffer, 1, BUF_SIZE, f);
                send(sock, buffer, (size_t) readed1, 0);
                sended1 += readed1;
            } while (sended1 != fsize1);
            fclose(f);
        }                                                   ///Конец_Передача файла
        else if (*ptn == 5) {

            printf("Клиент отключился!\n");

        }
        else if (*ptn == 6) {
            break;
        }

        close(sock); // закрываем сокет
        printf("\nОжидание подключения:\n");
    }
    close(sock);
    return 0;
}

Листинг Клиент:


/*  HELP:
..Server:
.........path: /home/bladzher/projects/[CLion]/FileTransferSystem/trunk/server
.........gcc server.c -o server
..Client
.........path: /home/bladzher/projects/[CLion]/FileTransferSystem/trunk/client
.........gcc client.c -o client
*******************************************************************************
*
* PATH files:
* ...........PC name: /ksergey/
* ...........Ultrabook name: /bladzher/
*
*******************************************************************************
 */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
//#include <dialog.h>
#include <time.h>
#include <search.h>
#include <bits/string2.h>

#define BUF_SIZE 1024

char message[1024];
char buf[sizeof(message)];

int main() {
    int sock;                // дескриптор сокета
    struct sockaddr_in addr; // структура с адресом

    sock = socket(AF_INET, SOCK_STREAM, 0); // создание TCP-сокета
    if (sock < 0) {
        perror("socket");
        exit(1);
    }

    // Указываем параметры сервера
    addr.sin_family = AF_INET; // домены Internet
    addr.sin_port = htons(3425); // Порт
    addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
    if (connect(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) // установка соединения с сервером
    {
        perror("Подключение");
        exit(2);
    }

    int number, *ptn;
    number = 0;
    ptn = &number;

    int number1, *ptn1;
    number1 = 0;
    ptn1 = &number1;

    recv(sock, message, sizeof(message), 0);
    printf("Сообщение от сервера: %s\n", message);

    printf("Введите команду серверу:");
    scanf("%d", &number);

    printf("Отправляю сообщение клиенту.\n");
    send(sock, (void const *) &number, 4, 0); // отправка сообщения на сервер
    recv(sock, message, sizeof(message), 0);
    printf("%d\n", *ptn);

    long buffer[BUF_SIZE];
    long rcv_len = 0;


    if (*ptn == 1) {

        FILE *f;
        if (!(f = fopen("/home/bladzher/Загрузки/list.xml", "wb"))) {
            perror("fopen");
            close(sock);
            exit(3);
        }

        do {
            rcv_len = recv(sock, buffer, BUF_SIZE, 0);
            fwrite(buffer, 1, (size_t) rcv_len, f);
        } while (rcv_len != 0);

        fclose(f);

    } else if (*ptn == 2) {

        char str[128];
        char str1[128];
        char str2[257];
        printf("Введите полный путь до файла[/home/bladzher/projects/[CLion]/FileTransferSystem/trunk/client/files/]:");
        scanf("%s", (char *) &str);
        printf("Ввелите полное имя файла с расширением[Сплин - Выхода нет.mp3]:");
        scanf("%s", (char *) &str1);
        //  printf("%s\n", str1);
        strcat(str2, str);
        strcat(str2, str1);
        printf("%s", str2);
        printf("\n");

    } else if (*ptn == 3) {

        printf("Введите номер файла для удаления:");
        scanf("%d", &number1);
        printf("Отправляю сообщение клиенту.\n");
        send(sock, (void const *) &number1, 4, 0); // отправка сообщения на сервер
        recv(sock, message, sizeof(message), 0);
        printf("%s\n", message);

    }
    else if (*ptn == 4) {                                              //Прием файла

        FILE *f;
        if (!(f = fopen("/home/bladzher/Загрузки/Дима_Пряхин-новая_религия.mp3", "wb"))) {
            perror("fopen");
            close(sock);
            exit(4);
        }
        rcv_len = 0;
        do {
            rcv_len = recv(sock, buffer, BUF_SIZE, 0);
            fwrite(buffer, 1, (size_t) rcv_len, f);
        } while (rcv_len != 0);

        fclose(f);
    }
        //Конец_Прием файла
    else if (*ptn == 5) {

        close(sock);

    }
    else if (*ptn == 6) {

        close(sock);

    }


    close(sock); // закрываем сокет
    return 0;
}

Подскажите пожалуйста в чем проблема,у меня при выборе первого варианта файл list.xml 0 байт у клиента,а тот же код только отправляю песню (4 вариант) все отправляется.

+ подскажите пожалуйста по коду,как лучше сделать данный проект,какие-нибудь советы.

+ проблема в том,что когда я выключаю сервер (Ctrl + C) или когда клиент посылает команду под номером 6(Откл.сервера),то при повторном запуске сервера пишется "./server bind: Address already in use" - как это исправить?

P.S. Извините,если плохо,что описал,спешу на работу,а спросить необходимо.Если будут вопросы пишите!

+ Теги почему-то не работают,чтобы красиво оформить :(

 , , , ,

BladzheR
()

Клиент-Сервер Socket linux (Музыкальный сервис)

Форум — Development

Здравствуйте! Пишу для себя написать музыкальный сервис с разными функциями работы. И при выполнении возникла проблема,помогите пожалуйста исправить.

Ситуация такая:у меня есть server.c и в этом каталоге есть папка music,где хранятся песни и хочу при подключении к серверу клиента,передать ему все содержимое каталога music т.е. имена песен ....mp3.

При подключении к серверу клиента,на сервере выводятся имена всех песен.(.\nmusic1.mp3\nmusic2.m\n...)После я хочу их передать клиенту и тут проблема,у клиента на экран выводится только ".". и после выводится дальше по коду,привет я муз.сервис и после вывода клиент висит.

Также по возможности прошу подсказать что стоит изменить или как лучше написать по всему коду т.к. пишу первый раз и скорее всего много багов или еще чего.

Листинг Сервера:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>

#define BUF_SIZE 4096

int main(int argc, char **argv)
{
    int sock, listener; 	  // дескрипторы сокетов
    struct sockaddr_in addr; // структура с адресом
    char buf[2048];		  // буфур для приема
    int bytes_read;			  // кол-во принятых байт





    listener = socket(AF_INET, SOCK_STREAM, 0); // создаем сокет для входных подключений
    if(listener < 0)
    {
        perror("socket");
        exit(1);
    }
    
    // Указываем параметры сервера
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr=inet_addr("127.0.0.1");
    if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0) // связываемся с сетевым устройство. Сейчас это устройство lo - "петля", которое используется для отладки сетевых приложений
    {
        perror("bind");
        exit(2);
    }

    listen(listener, 1); // очередь входных подключений
    
    while(1)
    {
        sock = accept(listener, NULL, NULL); // принимаем входные подключение и создаем отделный сокет для каждого нового подключившегося клиента
        if(sock < 0)
        {
            perror("Прием входящих подключений");
            exit(3);
        }

switch(fork())
{
case -1:
 perror("fork");
 break;
case 0:
close(listener);

/////////



DIR *dfd;
struct dirent *dp;
char filename[NAME_MAX];

if(argc < 2){strcpy(filename,"music");}
else{printf("error");exit(4);}
dfd=opendir(filename);
char readeds = 0;
char buffers[BUF_SIZE];
char* str;
while((dp=readdir(dfd))!= NULL){
 str=dp->d_name;
printf("%s\n",str);

send(sock,str,sizeof(str),0);
}
//send(sock,str,sizeof(str),0);
str=0;
send(sock,str,sizeof(str),0);

closedir(dfd);


//char str[]="hello worlds";
//send(sock,str,sizeof(str),0);
/////////

printf("Едем дальше...");
char text[]="Привет,Я музыкальный сервис!Вот мои композиции[1-6]:1)Safe And Sound;2)Papaoutai;3)We Own It;4)WWE-SHIELD;5)d.ramirez;6)Звуки природы";
char buftext[sizeof(text)];
send(sock,text,sizeof(text),0);
bytes_read = recv(sock, buf, 2048, 0); // принимаем сообщение от клиента
            if(bytes_read <= 0) {break;}
            printf("Клиент скачал композицию под номером: %s\n",buf);

FILE* f;
int x=atoi(buf);

switch(x){
case 1:
f = fopen("1.mp3","rb");
break;
case 2:
f = fopen("2.mp3","rb");
break;
case 3:
f = fopen("3.mp3","rb");
break;
case 4:
f = fopen("4.mp3","rb");
break;
case 5:
f = fopen("5.mp3","rb");
break;
case 6:
f = fopen("6.mp3","rb");
break;
}
fseek (f , 0 , SEEK_END);//устан.указатель текущей позиции файла (seek_end - поиск с конца файла).Если =0 -ошибка.
int fsize = ftell (f);//если ошибка: -1.ftell() считывает текущее значение указателя позиции файла.
rewind (f);

long sended = 0;
long readed = 0;
char buffer[BUF_SIZE];

do{
 readed = fread (buffer,1,BUF_SIZE,f);//считывание данных в память.
 send(sock, buffer, readed, 0);
 sended += readed;
}while(sended != fsize );
close(f);

   
        close(sock); // закрываем сокет
        _exit(0);
default:
close(sock);
}   
}

close(listener);

    
    exit(0);
}
Листинг Клиента:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define BUF_SIZE 4096

int main (int argc, char **argv)
{
char message[2048];
char buf[sizeof(message)];
int port,ch;

if(argc!=3){
printf("Не верное кол-во аргументов!\nДолжно быть 2 аргумента (Порт,ip-адрес -сервера)!\n");
exit(0);
}

    int sock;				  // дескриптор сокета
    struct sockaddr_in addr; // структура с адресом
    struct hostent* hostinfo;
port = atoi(argv[1]);
hostinfo = argv[2];

    sock = socket(AF_INET, SOCK_STREAM, 0); // создание TCP-сокета
    if(sock < 0)
    {
        perror("socket");
        exit(1);
    }

	// Указываем параметры сервера
    addr.sin_family = AF_INET; // домены Internet
    addr.sin_port = htons(port); // или любой другой порт...
    addr.sin_addr.s_addr=inet_addr(hostinfo);

    if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) // установка соединения с сервером
    {
        perror("Подключение");
        exit(2);
    }

////////////////

char buffers[BUF_SIZE];
char rcv_lens = 0;
char str[BUF_SIZE];
do{
rcv_lens=recv(sock, str, BUF_SIZE, 0);
 printf("%s\n",str);
if (!strcmp(str), 0){break;}
} while(rcv_lens != NULL);


//char str[BUF_SIZE];
//recv(sock, str, BUF_SIZE, 0);
//printf("%s",str);
////////////////

char buftext[1024];

int bytes_read=recv(sock,buftext,1024,0);
printf("Принятое сообщение от сервера: %s/n",buftext);
printf("Введите номер композиции(Для выхода:exit): "); 
    if (!strcmp(gets(message), "exit")){close(sock);return 0;}
send(sock, message, sizeof(message), 0); // отправка сообщения на сервер



FILE* f = fopen("music.mp3","wb");

char buffer[BUF_SIZE];
long rcv_len = 0;

do{
 rcv_len = recv(sock, buffer, BUF_SIZE, 0);
 fwrite (buffer,1,rcv_len,f);//считываем из памяти в файл
} while(rcv_len != 0);

fclose(f);


close(sock);
return 0;
    
}

 , , ,

BladzheR
()

Клиент-Сервер Socket linux (Система обмена сообщениями)

Форум — Development

Здравствуйте! Помогите,пожалуйста,доработать Клиент-Сервер.Никак не получается... Завтра последний день сдачи Условия выполнения: «Задание: разработать приложение-клиент и приложение сервер, обеспечивающие функции мгновенного обмена сообщений между пользователями.

Основные возможности. Серверное приложение должно реализовывать следующие функции: 1) Прослушивание определенного порта 2) Обработка запросов на подключение по этому порту от клиентов 3) Поддержка одновременной работы нескольких клиентов через механизм нитей 4) Передача текстового сообщения одному клиенту 5) Передача текстового сообщения всем клиентам 6) Прием и ретрансляция входящих сообщений от клиентов 7) Обработка запроса на отключение клиента 8) Принудительное отключение указанного клиента

Клиентское приложение должно реализовывать следующие функции: 1) Установление соединения с сервером 2) Передача сообщения всем клиентам 3) Передача сообщения указанному клиенту 4) Прием сообщения от сервера с последующей индикацией 5) Разрыв соединения 6) Обработка ситуации отключения клиента сервером

Настройки приложений. Разработанное клиентское приложение должно предоставлять пользователю настройку IP-адреса или доменного имени сервера сообщений и номера порта сервера. »

Пока в работе у меня выполнено следующие условия:Сервер:1,2,3 ;Клиент:1,. В данном случае у меня клиент отправляет сообщение серверу,а сервер отправляет этоже сообщение обратно клиенту.

Код Сервера:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
    int sock, listener;       // дескрипторы сокетов
    struct sockaddr_in addr; // структура с адресом
    char buf[2048];       // буфур для приема
    int bytes_read;           // кол-во принятых байт
 
 
    listener = socket(AF_INET, SOCK_STREAM, 0); // создаем сокет для входных подключений
    if(listener < 0)
    {
        perror("socket");
        exit(1);
    }
    
    // Указываем параметры сервера
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    //addr.sin_addr.s_addr = htonl(INADDR_ANY);
    addr.sin_addr.s_addr=inet_addr("127.0.0.1");
    if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0) // связываемся с сетевым устройство. Сейчас это устройство lo - "петля", которое используется для отладки сетевых приложений
    {
        perror("bind");
        exit(2);
    }
 
    listen(listener, 1); // очередь входных подключений
    
    while(1)
    {
        sock = accept(listener, NULL, NULL); // принимаем входные подключение и создаем отделный сокет для каждого нового подключившегося клиента
        if(sock < 0)
        {
            perror("Прием входящих подключений");
            exit(3);
        }
 
switch(fork())
{
case -1:
 perror("fork");
 break;
case 0:
close(listener);
 
 
        while(1)
        {
            printf("Ожидаем сообщение...\n");
 
 
            bytes_read = recv(sock, buf, 2048, 0); // принимаем сообщение от клиента
            if(bytes_read <= 0) break;
            printf("Получено %d bytes\tСообщение: %s\n", bytes_read, buf);
            printf("Отправляю принятое сообщение клиенту\n");
            send(sock, buf, bytes_read, 0); // отправляем принятое сообщение клиенту
        }
    
        close(sock); // закрываем сокет
        _exit(0);
default:
close(sock);
}   
    }
    
    return 0;
}
Код Клиента:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
 
int main (int argc, char **argv)
{
char message[2048];//=(char*)malloc(sizeof(char));// сообщение на передачу
char buf[sizeof(message)];
int port,ch;
//----------------------------------------------------------------------------
if(argc!=3){
printf("Не верное кол-во аргументов!\nДолжно быть 2 аргумента (Порт,ip-адрес -сервера)!\n");
exit(0);
}
 
    int sock;                 // дескриптор сокета
    struct sockaddr_in addr; // структура с адресом
    struct hostent* hostinfo;
port = atoi(argv[1]);
hostinfo = argv[2];
    sock = socket(AF_INET, SOCK_STREAM, 0); // создание TCP-сокета
    if(sock < 0)
    {
        perror("socket");
        exit(1);
    }
 
    // Указываем параметры сервера
    addr.sin_family = AF_INET; // домены Internet
    addr.sin_port = htons(port); // или любой другой порт...
    addr.sin_addr.s_addr=inet_addr(hostinfo);
    /*
     * Начинающие программисты часто спрашивают, как можно отлаживать сетевую программу, если под рукой нет сети.
     * Оказывается, можно обойтись и без неё. Достаточно запустить клиента и сервера на одной машине, а затем использовать для соединения адрес интерфейса внутренней петли (loopback interface).
     * В программе ему соответствует константа INADDR_LOOPBACK (не забудьте применять к ней функцию htonl!).
     * Пакеты, направляемые по этому адресу, в сеть не попадают.
     * Вместо этого они передаются стеку протоколов TCP/IP как только что принятые.
     * Таким образом моделируется наличие виртуальной сети, в которой вы можете отлаживать ваши сетевые приложения.
     */
   // addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
      //addr.sin_addr.s_addr = inet_addr(host_ip);
 if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) // установка соединения с сервером
    {
        perror("Подключение");
        exit(2);
    }
 
while(1){//WHILE <---
//----------------------------------------------------------------------------
    printf("Введите сообщение серверу(Для выхода:exit): "); 
    if (!strcmp(gets(message), "exit")){close(sock);return 0;}
//----------------------------------------------------------------------------
 
    printf("отправка сообщения на сервер...\n");
    send(sock, message, sizeof(message), 0); // отправка сообщения на сервер
    int bytes_read = 0;
    printf("Ожидание сообщения\n");
    bytes_read = recv(sock, buf, sizeof(message), 0);
    printf("Получено %d bytes\tСообщение: %s\n", bytes_read, buf); // прием сообщения от сервера
    
 
}//END_WHILE
    
return 0;
    
}

 , , ,

BladzheR
()

RSS подписка на новые темы