Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
irinasadikova
0 / 0 / 0
Регистрация: 08.12.2016
Сообщений: 54
1

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

12.12.2016, 14:35. Просмотров 554. Ответов 30
Метки нет (Все метки)

Как можно сделать чтоб сервер понимал что ему пришло файл или строка?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.12.2016, 14:35
Ответы с готовыми решениями:

Можно ли сделать, чтоб студия студия искала слоты и сигналы при написании SIGNAL или SLOT в connect?
В QtCreator-е есть несколько удобных фишек, упрощающих работу. Например,...

Http-сервер: Как сделать чтоб этот сервер понимал файлы расширением .php и .aspx
Здравствуйте друзья Как сделать чтоб этот сервер понимал файлы расширением...

Ребят дайте свой мудрый совет . Подскажите что можно сделать? Жить ему или нет?
Ребят помогите взгляните на это полено и скажи можно ли сделать что то с ним ??...

Как сделать чтоб когда открываешь файл каждая строка задавалась переменным l1,l2,l3....и т.д.?
Как сделать чтоб когда открываешь файл каждая строка задавалась переменным...

как сделать в этом коде чтоб конкретное число кнопок можно было задавать допустим 3 кнопки чтоб открывало
this.Load += new EventHandler(Form4_Load); button1.MouseHover +=...

30
Skjame
86 / 45 / 11
Регистрация: 20.12.2010
Сообщений: 216
Записей в блоге: 1
Завершенные тесты: 1
12.12.2016, 15:57 2
irinasadikova, Ирина, а можно подробности в студию?
0
Wyn
1056 / 638 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
12.12.2016, 16:09 3
Цитата Сообщение от irinasadikova Посмотреть сообщение
Как можно сделать чтоб сервер понимал что ему пришло файл или строка?
Кодировать и передать серверу типы передаваемых данных.
0
Maxim Prishchepa
Эксперт С++
1924 / 1036 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
12.12.2016, 19:27 4
делайте обвертку поверх TCP/UDP и понеслась
0
irinasadikova
0 / 0 / 0
Регистрация: 08.12.2016
Сообщений: 54
12.12.2016, 20:18  [ТС] 5
если честно я как-то не понимаю ваших слов

Добавлено через 38 минут
вот я написала идентификаторы на отправку
подскажите пожалуйста, как можно сделать, чтоб на приеме можно было прочитать имено первый символ, ну чтоб понять что там закодировано


отпраляю текст

C++ (Qt)
1
2
3
4
5
6
7
8
 qDebug() << "Client:: textSend";
    QByteArray sendline;
    QByteArray sendline1="1";
    sendline= widget.sendArea->text().toUtf8();
    
    
    write(socket_fd, sendline1.data(), sendline1.size());
    write(socket_fd, sendline.data(), sendline.size());
отправляю файл


C++ (Qt)
1
2
3
4
5
6
QFile file(filename);
QByteArray filedata = file.readAll();
QByteArray filedata1 = "2";
 
write(socket_fd, filedata1.data(), filedata1.size());
write(socket_fd, filedata.data(), filedata.size());
на приеме

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
  QByteArray recvBuffer;
    recvBuffer.resize(MAX_BUFFER);
    
 
    int dataread = ::read(socket_fd, recvBuffer.data(), recvBuffer.size());
    if(dataread > 0) {
        recvBuffer.resize(dataread);
       
        widget.ViewTextBrowser->append(QString("<font color="red">%1</font>").arg(QString::fromUtf8(recvBuffer)));
        qDebug() << "data read:" << recvBuffer;
0
nmcf
6399 / 5661 / 2581
Регистрация: 14.04.2014
Сообщений: 23,948
12.12.2016, 20:28 6
recvBuffer[0] проверяй после получения. И соответственно его нужно исключать после этого.
0
irinasadikova
0 / 0 / 0
Регистрация: 08.12.2016
Сообщений: 54
13.12.2016, 11:18  [ТС] 7
пишу так


C++ (Qt)
1
2
3
4
5
6
7
8
9
 int dataread = ::read(socket_fd, recvBuffer.data(), recvBuffer.size());
    if(dataread > 0) {
        recvBuffer.resize(dataread);
         if(recvBuffer[0]="1")
                                {
       
          widget.ViewTextBrowser->append(QString("<font color="red">%1</font>").arg(QString::fromUtf8(recvBuffer)));
          qDebug() << "data read:" << recvBuffer;
                                }
компилятор жалуется на условие.


Bash
1
2
Client.cpp.cc:154:26: error: invalid conversion from ‘const char*’ to ‘char’ [-fpermissive]
          if(recvBuffer[0]="1")
как же это так?
0
Воротислав
125 / 103 / 27
Регистрация: 25.02.2010
Сообщений: 451
13.12.2016, 12:43 8
irinasadikova, ну потому что проверка на равенство это "==", а не "="
0
ArmanPrestige
Pied Piper
232 / 223 / 57
Регистрация: 15.01.2013
Сообщений: 855
Завершенные тесты: 1
13.12.2016, 12:44 9
C++ (Qt)
1
if(recvBuffer[0]="1")
Обратите внимание, что у вас не сравнение происходит.
0
irinasadikova
0 / 0 / 0
Регистрация: 08.12.2016
Сообщений: 54
13.12.2016, 16:34  [ТС] 10
вот я не понимаю что компилятор от меня хочет

C++ (Qt)
1
2
 ‘QByteRef’ is not derived from ‘const std::pair<_T1, _T2>’
                               else if(recvBuffer[0]=="2")
0
nmcf
6399 / 5661 / 2581
Регистрация: 14.04.2014
Сообщений: 23,948
13.12.2016, 17:44 11
Кавычки одинарные для символа. Учитывая кодировки, лучше вообще не связываться с символами, а использовать числа. Алгоритм такой же, только при отправке и получении первый байт - целое число (без кавычек).
0
irinasadikova
0 / 0 / 0
Регистрация: 08.12.2016
Сообщений: 54
14.12.2016, 11:27  [ТС] 12
компилятор опять жалуется
Bash
1
2
invalid conversion from ‘int’ to ‘const char*[-fpermissive]
 QByteArray filedata1 = 2;
мне кажется с этим компилятором я не успею подготовиться к защите

и это тоже
C++ (Qt)
1
2
note: candidate 2: operator==(int, int) <built-in>
                               else if(recvBuffer[0]==2)
0
nmcf
6399 / 5661 / 2581
Регистрация: 14.04.2014
Сообщений: 23,948
14.12.2016, 11:42 13
C++ (Qt)
1
if (recvBuffer.at(0) == 2)
0
irinasadikova
0 / 0 / 0
Регистрация: 08.12.2016
Сообщений: 54
14.12.2016, 12:18  [ТС] 14
Цитата Сообщение от irinasadikova Посмотреть сообщение
2
invalid conversion from ‘int’ to ‘const char*’ [-fpermissive]
QByteArray filedata1 = 2;
а почему вот на это ошибка выдается?
0
nmcf
6399 / 5661 / 2581
Регистрация: 14.04.2014
Сообщений: 23,948
14.12.2016, 12:36 15
Ну не всему массиву же присваивать, а только первому элементу.
C++ (Qt)
1
2
3
QByteArray filedata1;
filedata1.resize(1);
filedata1[0] = '\x2';
Или так:
C++ (Qt)
1
QByteArray filedata1(1, '\x2');
0
irinasadikova
0 / 0 / 0
Регистрация: 08.12.2016
Сообщений: 54
14.12.2016, 13:28  [ТС] 16
скомпилировалось

написала вот такой код приема данных для текста и файлов

C++ (Qt)
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
void Client::recvData(void)
    {
 
    QByteArray recvBuffer;
     recvBuffer.resize(MAX_BUFFER);
 
 
     int dataread = ::read(socket_fd, recvBuffer.data(), recvBuffer.size());
     if(dataread > 0) {
         recvBuffer.resize(dataread);
          if(recvBuffer.at(0)==1)
                                 {
 
           widget.ViewTextBrowser->append(QString("<font color="red">%1</font>").arg(QString::fromUtf8(recvBuffer)));
           qDebug() << "data read:" << recvBuffer;
                                 }
                               else if(recvBuffer.at(0)==2)
                                    {
 
             QString fileName=QFileDialog::getSaveFileName(this,QString::fromUtf8("Save file"),QDir::currentPath(),"Images(*);;All files(*.*)");
              QFile file(fileName);
         
                file.write(recvBuffer);
           
          file.close();
 
                                      }
                      }
       }
только почему-то теперь на приеме выводится вместо слова только какой-то квадратик

а файл не записывается
0
nmcf
6399 / 5661 / 2581
Регистрация: 14.04.2014
Сообщений: 23,948
14.12.2016, 14:16 17
Нужно удалять первый байт после анализа. Я же писал об этом.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (recvBuffer.at(0) == 1)
{
    recvBuffer.remove(0, 1);
    widget.ViewTextBrowser->append(QString("<font color="red">%1</font>").arg(QString::fromUtf8(recvBuffer)));
    qDebug() << "data read:" << QString::fromUtf8(recvBuffer);
}
else if (recvBuffer.at(0) == 2)
{
    recvBuffer.remove(0, 1);
    QString fileName=QFileDialog::getSaveFileName(this,QString::fromUtf8("Save file"),QDir::currentPath(),"Images(*);;All files(*.*)");
    QFile file(fileName);
    file.write(recvBuffer);
    file.close();
}
Добавлено через 2 минуты
И файл открыть надо.
0
irinasadikova
0 / 0 / 0
Регистрация: 08.12.2016
Сообщений: 54
14.12.2016, 15:18  [ТС] 18
спаибо за совет, я сделала вот так, но данные не выводятся теперь вообще, даже квадратика нет. о боже, хоть бы квадратик вернуть что ли

C++ (Qt)
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
void Client::recvData(void)
    {
 
    QByteArray recvBuffer;
     recvBuffer.resize(MAX_BUFFER);
 
 
     int dataread = ::read(socket_fd, recvBuffer.data(), recvBuffer.size());
     if(dataread > 0) {
         recvBuffer.resize(dataread);
          if(recvBuffer.at(0)==1)
                                 {
            recvBuffer.remove(0,1);
           widget.ViewTextBrowser->append(QString("<font color="red">%1</font>").arg(QString::fromUtf8(recvBuffer)));
           qDebug() << "data read:" << recvBuffer;
                                 }
                               else if(recvBuffer.at(0)==2)
                                    {
            recvBuffer.remove(0,1);
             QString fileName=QFileDialog::getSaveFileName(this,QString::fromUtf8("Save file"),QDir::currentPath(),"Images(*);;All files(*.*)");
              QFile file(fileName);
           //   image = fopen(filename, "w");
             file.open(QIODevice::WriteOnly);
                file.write(recvBuffer);
             // fwrite(recvBuffer.data(), 1,recvBuffer.size(), file);
          file.close();
 
                                      }
 
 
 
 
                      }
 
 
       }
Добавлено через 8 минут
и почему-то файл создался, но он пустой

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

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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include "common_header.h"
#define PREFIX "SERVER: "
#define MAX_BUFFER 4095
#define PORT 22000
#include <arpa/inet.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
 
int main(int argc, char **argv)
{
    char str[MAX_BUFFER];
    /*socket for exchange data (send/recv)*/
    int client1 = -1;
    int client2 = -1;
 
    /*a descripter socket for binding to an adress */
    int listener;
 
    struct sockaddr_in servaddr;
 
    printf("\n   sozdaem ochered zaprosov na soedinenie \n");
    listener = socket(AF_INET, SOCK_STREAM, 0);
 
    bzero(&servaddr, sizeof(servaddr));
 
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(PORT); /* notice host to network conversion */
 
    printf("Bind socket \n");
    bind(listener, (struct sockaddr *) &servaddr, sizeof(servaddr));
 
    printf("Start listen on the socket\n");
    listen(listener, MAX);
 
 
 
    fd_set active_fd_set, read_fd_set;
    int i;
    struct sockaddr_in clientname;
    size_t size;
 
    /* Initialize the set of active sockets. */
    FD_ZERO (&active_fd_set);
    FD_SET (listener, &active_fd_set);
 
    while (1)
    {
        /* Block until input arrives on one or more active sockets. */
        read_fd_set = active_fd_set;
        if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0)
        {
            perror ("select");
            exit (EXIT_FAILURE);
        }
 
        /* Service all the sockets with input pending. */
        for (i = 0; i < FD_SETSIZE; ++i)
            if (FD_ISSET (i, &read_fd_set))
            {
                if (i == listener)
                {
                    if(client1 >= 0) {
                        printf("Pending connection from client 2\n");
                        client2 = accept(listener, 0, 0);
                        printf("Accepted connection %d\n", client2);
                        FD_SET (client2, &active_fd_set);
                    } else {
                        printf("Pending connection from client 1\n");
                        client1 = accept(listener, 0, 0);
                        printf("Accepted connection %d\n", client1);
                        FD_SET (client1, &active_fd_set);
                    }
                    /* Connection request on original socket. */
 
                }
                else
                {
                    int readData = read(i, str, MAX_BUFFER);
                    if (readData <= 0)
                    {
                        close (i);
                        FD_CLR (i, &active_fd_set);
                        if(i == client1) {
                            client1 = -1;
                        } else if(i == client2){
                            client2 = -1;
                        }
                        continue;
 
                    }
 
                    printf("Data from: %d %d %d\n", client1, client2, i);
 
                    if(i == client1) {
                        if(client2 > 0) {
                            write(client2, str, readData);
                        } else {
                            write(client1, str, readData);
                        }
                    } else {
                        if(client1 > 0) {
                            write(client1, str, readData);
                        } else {
                            write(client2, str, readData);
                        }
                    }
                }
            }
    }
}
0
nmcf
6399 / 5661 / 2581
Регистрация: 14.04.2014
Сообщений: 23,948
14.12.2016, 15:37 19
В recvBuffer данные приходят? dataread что показывает?
Что за сервер? Он просто пересылает то, что получил?
0
irinasadikova
0 / 0 / 0
Регистрация: 08.12.2016
Сообщений: 54
14.12.2016, 15:50  [ТС] 20
да, сервер так и работает.

в общем, до того как я решила замутить идентификацию файла и текста, текст приходил и отображался корректно.
а dataread для того чтоб функция read работала, ато компилятор жаловался на нее

Добавлено через 4 минуты
попробовала вывести значение dataread на экран. пусто
0
14.12.2016, 15:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2016, 15:50

Что можно сделать чтоб ФЧХ совпали?(
clc close all clear syms w w1 = logspace(-5,1,1000); den = ; num = ; sys...

Что пришло (и пришло ли?) на смену DCOM/RPC подходу?
Коллеги, кто распределенные приложения пишет - что пришло (и пришло ли?) на...

Что можно сделать, чтоб флеш начал включатся?
Привет, флеш в браузере chromium включается. Так как браузер у меня устаревший,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru