Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 24.12.2012
Сообщений: 19
1

синхронизация папок

14.03.2017, 15:25. Показов 1071. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день пытаюсь написать программу для синхронизации папок, но не могу понять в чем ошибка или ошибки, если есть идеи рад буду выслушать.
клиент
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
#include "stdafx.h"
 
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
 
 
#include <stdio.h>
#include <string.h>
#include <winsock2.h> // Включаем использование сокетов
#include <windows.h>
#include <memory.h>
#include <string.h>
#include "ConIo.h"
#include "tchar.h"
#include <iostream>
#include <fstream>
#include <thread>
const int TEN_KB = 64;
#pragma comment(lib, "WSock32.lib") // Используем эту библиотеку
#pragma comment (lib, "mswsock.lib")
 
#define FindFirstChangeNotification  FindFirstChangeNotificationW
#define PORT 15150
#define SERVERADDR "127.0.0.1"
 
unsigned char* sk;
unsigned char* pk;
 
#define Nsize 1024
#define _WIN32_WINNT 0x0500
struct papka {
    DWORD    dwFileAttributes;
    FILETIME ftCreationTime;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    DWORD    nFileSizeHigh;
    DWORD    nFileSizeLow;
    DWORD    dwReserved0;
    DWORD    dwReserved1;
    WCHAR    cFileName[MAX_PATH];
    WCHAR    cAlternateFileName[14];
};
 
papka x[100];
papka x1[100];
int prov(struct papka *p);
using namespace std;
int count1 = 0;
int procent = 100;
 
INT64* convert_to_64block(char* c)
{
 
    int len = strlen(c);
    int j = 0;
 
    INT64* buf = new INT64[len / 8];
    for (int i = 0; i < len / 8; i++)
    {
        int k = 0;
        while (k < 8 && j < len) {
            buf[i] = c[j];
            buf[i] <<= 8;
        }
    }
    return buf;
}
char* convert_to_chararray(INT64 buf)
{
    char* c = new char[8];
    for (INT i = 0; i < 8; i++) {
        c[i] = (char)buf;
        buf >> 8;
    }
    return c;
}
FILE* fileopen()
{
    char s[100];
    printf("Puts path to file\n");
    scanf_s("%s", &s, _countof(s));
    FILE *f;
    fopen_s(&f, s, "r+b");
    return f;
}
ifstream fileopen(char *s)
{
    ifstream file;
    file.open(s, ios::binary);
    /*FILE *f;
    fopen_s(&f, s, "r+b");
    return f;*/
    return file;
}
void send_to_serv_spisok()//функция отправки списка файлов
{
    long long kol = prov(x);
    WSADATA ws;
    WSAStartup(MAKEWORD(2, 2), &ws);
    sockaddr_in sok_adr;
    sok_adr.sin_family = AF_INET;
    sok_adr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    sok_adr.sin_port = htons(19000);
    SOCKET sok;
    sok = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    connect(sok, (sockaddr*)&sok_adr, sizeof(sok_adr));
    send(sok, (char*)&kol, sizeof(kol), NULL);
    for (int i = 0; i < kol; i++) {
        INT64* buf = new INT64[sizeof(papka) / 8];
        buf = convert_to_64block((char*)&x[i]);
        for (int ww = 0; ww < sizeof(papka) / 8; ww++)
        {
            send(sok, (char*)&buf[i], sizeof(INT64), NULL);
 
        }
    }
    closesocket(sok);
    //WSACleanup();
}
int send_to_serv_file(papka p)//функция отправки файла
{
    float one;
    long long size;
    ifstream f(p.cFileName, ifstream::binary);
 
    f.seekg(0, f.end);
    size = f.tellg();
    f.seekg(0, f.beg);
    one = (float)size / 100.0;
    WSADATA ws;
    WSAStartup(MAKEWORD(2, 2), &ws);
 
    sockaddr_in sok_adr;
    sok_adr.sin_family = AF_INET;
    sok_adr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    sok_adr.sin_port = htons(12000);
    SOCKET sok;
    sok = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    connect(sok, (sockaddr*)&sok_adr, sizeof(sok_adr));
    size = ((long long)&size);
    char* str = new char[TEN_KB];
    char *pBuf = str;
    int size_ok = 0;
    while (size>0) {
        SOCKET sok;
        long long size_m;
        if (size > TEN_KB)
            size_m = TEN_KB;
        else
            size_m = size;
        sok = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        f.read(str, size_m);
        connect(sok, (sockaddr*)&sok_adr, sizeof(sok_adr));
        size_m = ((long long)&size_m);
        send(sok, (char*)&size_m, sizeof(size_m), NULL);
        str = ((char*)str);
        send(sok, str, size_m, NULL);
        count1++;
        size -= size_m;
        str = pBuf;
        closesocket(sok);
    }
    f.close();
    return 0;
 
}
int prov(struct papka *p)//функция котрая проверяет были ли изменения в папке
{
    using namespace std;
    int i = 0;
    WIN32_FIND_DATAW wfd;
    HANDLE const hFind = FindFirstFileW(L"D:\\123\\*", &wfd);
    if (INVALID_HANDLE_VALUE != hFind)
    {
        do
        {
            memcpy(&p[i], &wfd, sizeof(wfd));
            i++;
        } while (NULL != FindNextFileW(hFind, &wfd));
 
        FindClose(hFind);
    }
    return i;
}
void recv_file(SOCKET connect, WCHAR* path)//функция принятия файла
{
    std::ofstream fileToWrite(path, std::ifstream::binary);
    unsigned  long long length;
    recv(connect, (char *)&length, sizeof(length), NULL);
    length = ((long long)&length);
    unsigned long long count = length / TEN_KB;
    int count1 = length % TEN_KB;
    int sizeOfBlock = TEN_KB;
    int recvBlockSize = 0;
    char *buffer = new char[TEN_KB];
    char *pBuf = buffer;
    for (unsigned long long i = 0; i < length;) {
        while (true) {
            if ((recvBlockSize = recv(connect, buffer, sizeOfBlock, NULL))) {
                sizeOfBlock -= recvBlockSize;
                i += recvBlockSize;
                if (sizeOfBlock == 0) {
                    sizeOfBlock = TEN_KB;
                }
                fileToWrite.write(buffer, recvBlockSize);
                break;
            }
        }
 
    }
}
SOCKET listen1, sen;
void lisen()//наш поток
{
 
    SOCKET connect = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    int rezult = listen(listen1, SOMAXCONN);
    while (true)
    {
        sockaddr sa;
        int len;
        connect = accept(listen1, &sa, NULL);//устанавливаем соединение с сервером
        int rez;
        recv(connect, (char*)&rez, sizeof(int), NULL);//принимаем сообщения от клиента с идентификатором требуемого действия(их может быть больше чем 2)
        switch (rez)
        {
        case(0) : {
            /* long len;
            recv(connect, (char*)&len, sizeof(long), NULL);*/
            papka p;
            recv(connect, (char*)&p, sizeof(papka), NULL);//принимаем информацию о принимаемом файле
            recv_file(connect, p.cFileName);//принимаем файл
            break;
        }
        case(1) :
        {
            papka p;
            recv(connect, (char*)&p, sizeof(papka), NULL);//принимаем информацию о файле для передачи
            send_to_serv_file(p);//передаем файл
            break;
        }
        }
    }
}
int main(int argc, char* argv[])
{
    char* a;
    int j;
    HANDLE hThread;
    LPVOID ptrBlock;
    DWORD idThread;
    char buffer[30 * Nsize];
    char buff[Nsize + 1];
    uint32_t on;
    printf("Client start working...\n");
    int kol = prov(x);
    WSADATA wsaData;
#pragma region Инициализация сокетов для нашего потока
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    listen1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    sen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    sockaddr_in server;
    server.sin_family = AF_INET;
    server.sin_port = htons(19000);
    server.sin_addr.s_addr = htonl(INADDR_ANY);
    int len;
    bind(listen1, (SOCKADDR*)&server, NULL);
    server.sin_family = AF_INET;
    server.sin_port = htons(16000);
    server.sin_addr.s_addr = htonl(INADDR_ANY);
    bind(sen, (SOCKADDR*)&server, sizeof(server));
#pragma endregion
    DWORD uThrID;//создаем поток что бы все время слушать сообщения от сервера и обрабатывать их
    HANDLE hThr = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)lisen, NULL, 0, &uThrID);//попробывал по другому создать процес(не помогло)
    send(sen, (char*)pk, 32, 0);
    send(sen, (char*)sk, 32, 0);
    send_to_serv_spisok();//отправляем список файлов серверу
#pragma region Обработка запросов сервера
    while (true)
    {
        if (FindFirstChangeNotification(_T("D:\\123\\*"), TRUE, FILE_NOTIFY_CHANGE_FILE_NAME) == INVALID_HANDLE_VALUE);//изм в папке 
        {
 
            int kol2 = prov(x1);//состовляем новый список файлов
            for (int i = 0; i < kol2; i++)
            {
                bool flag = false;
                for (j = 0; j < kol; j++)
                {
                    if ((lstrcmpW(x[j].cFileName, x1[i].cFileName) == 0) && (x[j].nFileSizeLow == x1[i].nFileSizeLow))//поиск изм файла
                    {
                        flag = true;
 
                    }//синхранизация
                }
                if (flag == false) {
 
                    send_to_serv_spisok();//отправляем список серверу если произошло изменение(по хорошему нужно отправлять это все время,а нетолько после изменения для тогог чтобы получать новые файлы с сервера)
                    break;
                }
            }
        }
    }
#pragma endregion
    //иницилизация библиотеки Winsocks
 
    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
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
#include "stdafx.h"
#pragma comment(lib, "Ws2_32.lib")
#include <iostream>
#include <winsock2.h>
#include <fstream>
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include <tchar.h>
 
unsigned char* sk;
unsigned char* pk;
 
struct papka {
    DWORD    dwFileAttributes;
    FILETIME ftCreationTime;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    DWORD    nFileSizeHigh;
    DWORD    nFileSizeLow;
    DWORD    dwReserved0;
    DWORD    dwReserved1;
    WCHAR    cFileName[MAX_PATH];
    WCHAR    cAlternateFileName[14];
};
using namespace std;
const int TEN_KB = 64;
papka x[100];
papka x1[100];
papka x2[100];
SOCKET sok[100];
 
char* convert_to_chararray(INT64 buf)
{
    char* c = new char[8];
    for (INT i = 0; i < 8; i++) {
        c[i] = (char)buf;
        buf >> 8;
    }
    return c;
 
}INT64* convert_to_64block(char* c)
{
 
    int len = strlen(c);
    int j = 0;
 
    INT64* buf = new INT64[len / 8];
    for (int i = 0; i < len / 8; i++)
    {
        int k = 0;
        while (k < 8 && j < len) {
            buf[i] = c[j];
            buf[i] <<= 8;
        }
    }
    return buf;
}
int prov(struct papka *p)//проверяем появление новых файлов
{
    using namespace std;
    int i = 0;
    WIN32_FIND_DATAW wfd;
    HANDLE const hFind = FindFirstFileW(L"D:\\124\\*", &wfd);
    if (INVALID_HANDLE_VALUE != hFind)
    {
        do
        {
            memcpy(&p[i], &wfd, sizeof(wfd));
            i++;
        } while (NULL != FindNextFileW(hFind, &wfd));
 
        FindClose(hFind);
    }
    return i;
}
void search(SOCKET s)//уже не нужна(нигде не используется)
{
    for (int i = 0; i < 100; i++) {
        if (s == sok[i])
            return;
    }
    for (int i = 0; i < 100; i++) {
        if (sok[i] == NULL) {
            sok[i] = s;
            return;
        }
    }
}
int sear(papka p, papka* pp)//проверяет есть ли в нашем списке pp файл р
{
 
    bool flag = false;
    for (int j = 0; j < 100; j++)
    {
        if ((lstrcmpW(pp[j].cFileName, p.cFileName) == 0) && (pp[j].nFileSizeLow == p.nFileSizeLow))//поиск изм файла
        {
            flag = true;
 
        }//синхранизация
    }
    if (flag == false)
    {
        return 1;
    }
    return 0;
}
 
ifstream fileopen(char *s)
{
    ifstream file;
    file.open(s, ios::binary);
    /*FILE *f;
    fopen_s(&f, s, "r+b");
    return f;*/
    return file;
}
void send_file(SOCKET sok, sockaddr sok_adr, WCHAR* path)//отправка файла
{
    ifstream f(path, ifstream::binary);
    connect(sok, (sockaddr*)&sok_adr, sizeof(sok_adr));
    long long size;
 
    f.seekg(0, f.end);
    size = f.tellg();
    f.seekg(0, f.beg);
    size = ((long long)&size);
    send(sok, (char*)&size, sizeof(int), NULL);
    char* str = new char[TEN_KB];
    char *pBuf = str;
    int size_ok = 0;
    while (size > 0) {
        SOCKET sok;
        long long size_m;
        if (size > TEN_KB)
            size_m = TEN_KB;
        else
            size_m = size;
        sok = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        f.read(str, size_m);
        connect(sok, (sockaddr*)&sok_adr, sizeof(sok_adr));
        size_m = ((long long)&size_m);
        send(sok, (char*)&size_m, sizeof(size_m), NULL);
        str = ((char*)str);
        send(sok, str, size_m, NULL);
    }
    f.close();
}
int zapros(SOCKET connect)//получения списка файлов клиента
{
    unsigned int length;
    recv(connect, (char *)&length, sizeof(length), NULL);
    int j = 0;
    for (int i = 0; i < length; i++)
    {
        papka p;
        recv(connect, (char *)&p, sizeof(papka), NULL);
        x[i] = p;
        if (sear(p, x) == 1) //проверяет есть ли у нас этот файл и записывает его в список для получения
        {
            x1[j] = p;
            j++;
        }
    }
    return j;
}
void recv_file(SOCKET connect, WCHAR* path)//принятия файлов
{
    std::ofstream fileToWrite(path, std::ifstream::binary);
    unsigned  long long length;
    recv(connect, (char *)&length, sizeof(length), NULL);
    length = ((long long)&length);
    unsigned long long count = length / TEN_KB;
    int count1 = length % TEN_KB;
    int sizeOfBlock = TEN_KB;
    int recvBlockSize = 0;
    char *buffer = new char[TEN_KB];
    char *pBuf = buffer;
    for (unsigned long long i = 0; i < length;) {
        while (true) {
            if ((recvBlockSize = recv(connect, buffer, sizeOfBlock, NULL))) {
                sizeOfBlock -= recvBlockSize;
                i += recvBlockSize;
                if (sizeOfBlock == 0) {
                    sizeOfBlock = TEN_KB;
                }
                fileToWrite.write(buffer, recvBlockSize);
                break;
            }
        }
    }
}//
 
int _tmain(int argc, _TCHAR* argv[])
{
    WSADATA wsaData;
    void sodium_memzero(void * const pnt, const size_t len);
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    SOCKET listen1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    SOCKET connect = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    SOCKET sen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    sockaddr_in server;
    printf("Server start working...\n");
    server.sin_family = AF_INET;
    server.sin_port = htons(19000);
    server.sin_addr.s_addr = htonl(INADDR_ANY);
    bind(listen1, (SOCKADDR*)&server, sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = htons(16000);
    server.sin_addr.s_addr = htonl(INADDR_ANY);
    bind(sen, (SOCKADDR*)&server, sizeof(server));
    listen(listen1, SOMAXCONN);
    while (true) {
        sockaddr sa;
        recv(sen, (char*)pk, 32, NULL);
        recv(sen, (char*)sk, 32, NULL);
        connect = accept(listen1, &sa, NULL);//каждый раз когда будет приходить информация от клиента, 
        int j = zapros(connect);//сервер будет принимать у него весь список и находить те файлы каких у него нету.
        for (int i = 0; i < j; i++)
        {
            INT64* buf = convert_to_64block((char*)&x1[i]);
            for (int ww = 0; ww < (strlen((char*)&x1[i]) / 8); ww++)
            {
                char*ttt = ((char*)&buf[i]);
                send(sen, ttt, sizeof(INT64), 0);//отправит название файла клиенту
            }
            recv_file(connect, x1[i].cFileName);//в ответ он пришлет файл
        }
        prov(x2);//теперь проанализируем каких файлов не хватает нашему клиенту
        for (int i = 0; i < 100; i++) {
            if (sear(x2[i], x1) == 1)
            {
                send_file(sen, sa, x2[i].cFileName);//отправим их клиенту
            }
        }//и так в бесконечном цикле
    }
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.03.2017, 15:25
Ответы с готовыми решениями:

Синхронизация папок
Задача - синхронизация выбранной папки между компьютерами. На одном стоит Windows7, на втором -...

Синхронизация папок
Необходимо создать программу которая раз в 10 секунд проверяет папку №1, если в папке появляются...

Синхронизация папок
Доброй ночи всем. Есть задача: синхронизировать две папки. Пока только знаю как копировать файлы :D...

Синхронизация папок
На 2-х ПК необходимо иметь синхронизировать папки, с учетом всех изменений. Банальным копированием...

0
14.03.2017, 15:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.03.2017, 15:25
Помогаю со студенческими работами здесь

Синхронизация папок
Имеется один компьютер с UBUNTU на котором хранятся файлы и папки, нужно предоставить доступ к этим...

Rsync синхронизация папок
Есть две папки dir1 и dir2 В dir2 файлы всё время прибавляются и обновляются. Необходимо в...

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

ubuntu linux синхронизация папок
задача достаточно проста: синхронизация файлов между флешкой и папкой на компе нажатием кнопки ...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru