Форум программистов, компьютерный форум CyberForum.ru

Передать двумерный массив от клиента серверу - C++

Восстановить пароль Регистрация
 
Maladar
1 / 1 / 0
Регистрация: 30.08.2014
Сообщений: 15
08.09.2014, 14:45     Передать двумерный массив от клиента серверу #1
Доброго времени суток. Помогите пожалуйста. Не понимаю, как передать двумерный массив от клиента серверу. Работаю под Ubuntu 14. Для передачи использую функции write и read. Сервер и клиент компилируются, но при передаче выдает "Ошибка сегментирования (сделан дамп памяти)". Мне кажется, что причина ошибки в сервере, т.к он не может преобразовать символы в числа, но я не понимаю, как это исправить.
Здесь я передаю массивы серверу
C++
1
2
int sendTWO = write(client, *&a, sizeof(double));
    int sendTHREE = write(client, &x, sizeof(double));
Здесь сервер принимает значения
C++
1
2
double **a = ((double***)bufTWO)[100];  
     double *y = ((double**)bufTHREE)[100];
Полный код клиента
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <iostream>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
using namespace std;
 
void ReadMatr(double **a, int n, int m) 
{
    int i, j;
    cout << "Ввод СЛАУ(" << n << "*" << m << "):" << endl;
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            cout << "a[" << i + 1 << "][" << j + 1 << "] = ";
            cin >> a[i][j];
        }
    }
}
 
void PrintMatr(double **a, int n, int m)
{
    int i, j;
    cout << "Матрица:" << endl;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
            cout << a[i][j] << " ";
        cout << endl;
    }
}
 
void print_x(int stb, double *x)
{
    for (int i = 0; i<stb; i++)
        printf("x[%d]=%f \t", i, x[i]);
    cout << " " << endl;
}
 
 
int main(int argc, char *argv[]) {
    if (!strcmp(argv[argc-1], "--help")) {
        cout << "Это программа - клиент. Клиент-серверного приложения, которая решает СЛАУ методом Гаусса" << endl;
        cout << "После запуска программы вам необходимо ввести значние кол-ва строк и столбцов и саму СЛАУ. После этого вы увидите результат на экране" << endl;
        cout << "Запуск клиента с ключом --exit выключит сервер" << endl;
        return 0;   
    }
    int client = open("client_write_fifo",O_WRONLY); //сюда будет записывать данные клиент, которые будет обрабатывать сервер
    int server = open("server_write_fifo",O_RDONLY); //от сюда будет читать клиент те данные, которые туда записал сервер
    
    if(client == -1 || server == -1){ //необходима проверка, вдруг сервер не запущен
        cout<<"Ошибка"<<endl;
        return 1;
    }   
 
    if (!strcmp(argv[argc-1], "--exit")) { //обрабатываем ключ --exit, который останавливает сервер
        cout << "Сервер выключен" << endl;
        char buf = 'e';
        int send = write(client,&buf,sizeof(char)); //записываем код выключения для сервера
        return 0;   
    }
    //если все корректно запущенно, и не введен ключ --exit, то делаем, то что от нас требуется
    int i, stb = 0, str = 0, j;
    double **a, *b, *x, *z;
    
    cout << "Введите число строк: ";
    cin >> str;
    cout << "Введите число столбцов: ";
    cin >> stb;
    
    a = new double*[stb];
    for (i = 0; i < str; i++)
        a[i] = new double[stb];
    // Ввод СЛАУ
    ReadMatr(a, str, stb);
    PrintMatr(a, str, stb);
    int send = write(client, &str, sizeof(double));
    int sendTWO = write(client, *&a, sizeof(double));
    int sendTHREE = write(client, &x, sizeof(double));
 
    
    read(server, &z, sizeof(double));
    
    print_x(str, z);
    return 0;
}
Полный код сервера
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
using namespace std;
 
int gaus(int cnt_str, double **mass, double *&x)
{
    int i, j, k;
    x = new double[cnt_str];
    
    for (i = 0; i<cnt_str; i++)
    {
        double a = mass[i][i];
        for (j = i + 1; j<cnt_str; j++)
        {
            double b = mass[j][i];
            for (k = i; k<cnt_str + 1; k++)
                mass[j][k] = mass[i][k] * b - mass[j][k] * a;
        }
    }
    
    for (i = cnt_str - 1; i >= 0; i--)
    {
        double summ = 0.;
        for (j = i + 1; j<cnt_str; j++)
            summ += mass[i][j] * x[j];
        summ = mass[i][cnt_str] - summ;
        if (mass[i][i] == 0)
            return 0;
        x[i] = summ / mass[i][i];
    }
 
    return 1;
}
 
int main(int argc, char *argv[]) {
    
    umask(0); //разрешить любые права
    
    mknod("client_write_fifo",S_IRWXU+S_IFIFO,0); //создаем канал, куда будет писать клиент
    mknod("server_write_fifo",S_IRWXU+S_IFIFO,0); //создаем канал, куда будет писать сервер
    
    int client = open("client_write_fifo",O_RDONLY); //открываем канал клиента
    int server = open("server_write_fifo",O_WRONLY); //открываем канал сервера
    while (1) {//сервер будет работать, пока его не выключат со стороны клиента
        char buf[100];
        char bufTWO[100];
        char bufTHREE[100];
        while(read(client,buf,8)<1) {} //считываем, что нам написал сервер
        if (buf[0] == 'e') { //если был записан код выключения, выключаем сервер
            close(server);
            close(client);          
            unlink("client_write_fifo");
            unlink("server_write_fifo");
            
            return 0;   
        }
        read(client, bufTWO, 100);
        read(client, bufTHREE, 100);
        double str = ((double*)buf)[100];
        double **a = ((double***)bufTWO)[100];  //если не код ошибки, то переводим считанное в double
        
        double *y = ((double**)bufTHREE)[100];
        if (gaus(str, a, y) == 1)
        {
        write(server,&y,sizeof(double)); //записываем в канал сервера данные, чтобы сервер их считал
        }
    }
    close(server);
    close(client);
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2014, 14:45     Передать двумерный массив от клиента серверу
Посмотрите здесь:

передать двумерный массив в функцию C++
Надо передать серверу идентификатор клиента при соединении C++
C++ передать двумерный массив в функцию
Передать двумерный массив указателей в функцию C++
Двумерный массив передать в ф-ю C++
Передать в функцию двумерный массив C++
C++ Как передать двумерный массив функции?
C++ Не могу передать двумерный массив в функцию

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 04:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru