Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
1 / 1 / 0
Регистрация: 17.12.2013
Сообщений: 110
1

Пересылка бинарного файла с клиента на сервер

19.11.2016, 23:24. Показов 1266. Ответов 4
Метки нет (Все метки)

Всем доброго времени суток. Есть 2 проги: сервер и клиент. С клиента на сервер посылается бинарный файл и исполняется на нем. Файл вводится в командной строке, затем открывается в бинарном режиме и посылается на сервер по частям. Там он сохраняется в другой файл с новым именем. Как это реализовать? Через send и recv? Как присвоить аргумент командной строки charу а затем использовать в fopen?

Сервер
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
#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#include <time.h>
#include <locale.h>
#include <string>
 
#pragma comment(lib, "Ws2_32.lib")
 
#define PORT 6091
 
void getError(DWORD errCode) 
   {
   char* error; 
   FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
      NULL,
      errCode != 0 ? errCode : WSAGetLastError(),
      MAKELANGID(LANG_RUSSIAN, SUBLANG_DEFAULT),
      error,
      sizeof(error),
      NULL);  
   printf("\nОшибка: %s\n", error); 
   getchar();
   }
 
int main()
   {
    setlocale(LC_ALL, "Russian");
    
   WSADATA winsock;
   if (FAILED(WSAStartup(MAKEWORD(1, 1), &winsock)))
   {
       DWORD error = WSAGetLastError();
       getError(error);
       return -1;
   }
   SOCKET sock, sub;
   sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
   if (sock == INVALID_SOCKET)
   {
       DWORD error = WSAGetLastError();
       getError(error);
       return -2;
   }
   sockaddr_in addr;
   
   sockaddr_in incomingAddress;
   int addressLen = sizeof(incomingAddress);
   ZeroMemory(&addr, sizeof(addr)); 
   addr.sin_family = AF_INET;
   addr.sin_port = htons(PORT);
   if (bind(sock, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) {
       DWORD error = WSAGetLastError();
       getError(error);
       return -3;
   }
 
  if (listen(sock, 1) == SOCKET_ERROR) { //Переводит сокет в состояние ожидания подключений 
       DWORD error = WSAGetLastError();
       getError(error);
       return -4;
   }
   
   printf("Ожидание подключения\n");
 
   sub = accept(sock, (sockaddr*)&incomingAddress, &addressLen); 
   if (sub == INVALID_SOCKET){
       DWORD error = WSAGetLastError();
       getError(error);
       return -5;
    }
   char *clientIP = inet_ntoa(incomingAddress.sin_addr);
   int clientPort = ntohs(incomingAddress.sin_port);
   printf("Клиент подключен!\n");
   printf("IP: %s:%d\n", clientIP, clientPort);
   
   int size = 0;
   int fullFileSize = 0;
   char fileSize[5];
   char buffer[200];
   char filename[200];
   FILE *file;
 
   
   std::string fname = "file" + std::to_string(rand() % 1000) + ".exe"; //функция переименования файла
   char name[15];
   memset(name, 0, sizeof(fname));
   strncpy(name, fname.c_str(), sizeof(name) - 1);
   file = fopen(filename, "wb");
   while (true)
   
       fclose(file);
 
 
   STARTUPINFO cif;
   ZeroMemory(&cif, sizeof(STARTUPINFO));
   PROCESS_INFORMATION pi;
   CreateProcess((LPCSTR)filename, NULL, NULL, NULL, FALSE, NULL, NULL, NULL, &cif, &pi);
 
   closesocket(sub);
   closesocket(sock);
   WSACleanup();
   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
#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#include <locale.h>
#include <string>
#pragma comment(lib, "Ws2_32.lib")
 
 
void getError(DWORD errCode)
   {
   char *error; 
   FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, 
                 NULL, 
                 errCode != 0 ? errCode : WSAGetLastError(), 
                 MAKELANGID(LANG_RUSSIAN, SUBLANG_DEFAULT), 
                 error, 
                 sizeof(error), 
                 NULL); 
   printf("\nОшибка: %s\n", error); 
   getchar();
   }
 
int main(int argc, char *argv[])
   {
    
    setlocale(LC_ALL, "Russian");
    if (argc != 2) printf("Введите имя бинарного файла \n"); else
    {
        std::string fname = argv[1];
    }
    SOCKET sock;
   sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
   if (sock == INVALID_SOCKET)
   {
       DWORD error = WSAGetLastError();
       getError(error);
       return -1;
   }
 
   WSADATA winsock;
   if (FAILED(WSAStartup(MAKEWORD(1, 1), &winsock)));
   {
       DWORD error = WSAGetLastError();
       getError(error);
       return -2;
   }
   sockaddr_in addr;
 
                  ZeroMemory(&addr, sizeof(addr));              
   addr.sin_family = AF_INET;                     
   addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
   addr.sin_port = htons(6091);                   
 
   if (connect(sock, (sockaddr*)&addr, sizeof(addr)) < 0) 
      {
       DWORD error = WSAGetLastError();
       getError(error);
       return -3;
      }
 
   printf("Подключение успешно !\n");
   printf("Посылаю файл .. \n");
 
   
   FILE *file ;
   char buffer[1000];
   char cSize[5];
   int size = 1000;
   int fullFileSize = 0;
   
   if ((file = fopen("fname", "rb")) == NULL) {
       printf("Ошибка открытия файла.\n");
       return -4;
   }
   
   
 
   
   fclose(file); 
 
   
   closesocket(sock);
   WSACleanup();
   return 0;
   }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.11.2016, 23:24
Ответы с готовыми решениями:

Загрузка файла с клиента на сервер
Здравствуйте, можно загружать файлы на сервер от клиента без использования fileuploader??

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

Копирование файла с клиента на сервер
Привет! Мне нужно перекачать файл jpg с клиента на сервер. Я искала метод типа copyFile, а нашла...

Передача файла с клиента на сервер
Помогите надо сделать передачу между клиентом - сервером. Пример если в клиенти выбрать файл то он...

4
Заблокирован
19.11.2016, 23:30 2
Цитата Сообщение от Anbore Посмотреть сообщение
Через send и recv?
Да.
Цитата Сообщение от Anbore Посмотреть сообщение
Как присвоить аргумент командной строки charу а затем использовать в fopen?
Аргументы в main уже указывают на строку char'ов.
C
1
fopen(argv[1],"r");
Откроет файл из первого аргумента.
0
1 / 1 / 0
Регистрация: 17.12.2013
Сообщений: 110
19.11.2016, 23:40  [ТС] 3
А как передавать по частям файл используя send и recv?
0
Заблокирован
20.11.2016, 00:47 4
Цитата Сообщение от Anbore Посмотреть сообщение
А как передавать по частям файл используя send и recv?
Читаешь в буфер из файла, и его записываешь в сокет. На сервере из сокета читаешь, и записываешь в файл. Ну, и придумай свой мини-протокол, чтобы сервер знал, что началась передача файла, когда она закончилась и т. п.
0
1 / 1 / 0
Регистрация: 17.12.2013
Сообщений: 110
24.11.2016, 04:39  [ТС] 5
не пересылает
пишет: "Сделана попытка выполнить операцию на объекте, не являющемся сокетом."

клиент
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
#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#include <locale.h>
#include <string>
 
#pragma comment(lib, "Ws2_32.lib")
 
#define PORT 6091
 
void getError(DWORD errCode)
   {
   char error[1000]; 
   FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, 
                 NULL, 
                 WSAGetLastError(), 
                 MAKELANGID(LANG_RUSSIAN, SUBLANG_DEFAULT), 
                 error, sizeof(error), NULL); 
   printf("\nОшибка: %s\n", error); 
   getchar();
   }
 
int main(int argc, char *argv[])
{
 
    setlocale(LC_ALL, "Russian");
 
    WSADATA winsock;
    SOCKET sock;
    if ((WSAStartup(MAKEWORD(2, 0), &winsock))!=NO_ERROR)
    {
        DWORD error = WSAGetLastError();
        getError(error);
        return -1;
    }
 
    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sock == INVALID_SOCKET)
    {
        DWORD error = WSAGetLastError();
        getError(error);
        return -2;
    }
 
    sockaddr_in addr;
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    addr.sin_port = htons(PORT);
 
    if (connect(sock, (sockaddr*)&addr, sizeof(addr)) != 0)
    {
        DWORD error = WSAGetLastError();
        getError(error);
        return -3;
    }
 
    printf("Подключение успешно !\n");
    printf("Посылаю файл .. \n");
 
    FILE *otpr_file;
    char buff[200];
    memset(buff, 0, 200);
    if ((otpr_file = fopen("D:\\Projects\\server_client\\Debug\\rufus.exe", "rb")) == NULL)
    {
        printf("Ошибка открытия файла.\n");
        return -4;
    }
    else
    {
        for (;;)
        {
            fread(buff, 5, 200, otpr_file);
            int send_chars = send(sock, buff, 200, 0);
            if (send_chars > 0)
            {
                printf("Получено байт: %d\n", send_chars);
            }
            else if (send_chars == 0)
            {
                printf("Соединение закрыто\n");
                break;
            }
            else if (send_chars == SOCKET_ERROR)
            {
                DWORD error = WSAGetLastError();
                getError(error);
                return -5;
                break;
            }
        }
        fclose(otpr_file);
        closesocket(sock);
        WSACleanup();
        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
#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#include <locale.h>
#include <string>
 
#pragma comment(lib, "Ws2_32.lib")
 
#define PORT 6091
 
void getError(DWORD errCode) 
   {
   char* error; 
   FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
      NULL,
      errCode != 0 ? errCode : WSAGetLastError(),
      MAKELANGID(LANG_RUSSIAN, SUBLANG_DEFAULT),
      error,
      sizeof(error),
      NULL);  
   printf("\nОшибка: %s\n", error); 
   getchar();
   }
 
int main()
   {
    setlocale(LC_ALL, "Russian");
    
   WSADATA winsock;
   if (FAILED(WSAStartup(MAKEWORD(1, 1), &winsock)))
   {
       DWORD error = WSAGetLastError();
       getError(error);
       return -1;
   }
   SOCKET sock, sub;
   sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
   if (sock == INVALID_SOCKET)
   {
       DWORD error = WSAGetLastError();
       getError(error);
       return -2;
   }
   sockaddr_in addr;
   
   sockaddr_in incomingAddress;
   int addressLen = sizeof(incomingAddress);
   memset(&addr, 0, sizeof(addr));
   addr.sin_family = AF_INET;
   addr.sin_port = htons(PORT);
   addr.sin_addr.s_addr = inet_addr("127.0.0.1");
   if (bind(sock, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) 
   {
       DWORD error = WSAGetLastError();
       getError(error);
       return -3;
   }
 
  if (listen(sock, SOMAXCONN) == SOCKET_ERROR) 
  {
      DWORD error = WSAGetLastError();
       getError(error);
       return -4;
   }
  char buffer[200];
  FILE * prin_file;
  std::string fname = "file" + std::to_string(rand() % 1000) + ".exe";
  char new_name[20];
  memset(new_name, 0, sizeof(fname));
  strncpy(new_name, fname.c_str(), sizeof(new_name) - 1);
  prin_file = fopen(new_name, "wb");
   printf("Ожидание подключения\n");
   for (;;)
   {
       sub = accept(sock, (sockaddr*)&incomingAddress, &addressLen);
       if (sub != INVALID_SOCKET)
       {
           printf("Клиент подключен!\n");
           for (;;) {
               int recv_chars = recv(sub, buffer, 200, 0);
               if (recv_chars > 0)
               {
                   printf("Получено байт: %d\n", recv_chars);
                   fwrite(buffer, 5, 200, prin_file);
               } 
               else if (recv_chars == 0)
               {       
                printf("Соединение закрыто\n");
                
                break;
           }  else if (recv_chars == SOCKET_ERROR)
               {
                   DWORD error = WSAGetLastError();
                   getError(error);
                   return -5;
                   break;
               }
           }    
       } 
   }
   fclose(prin_file);
 
   STARTUPINFO si;
   PROCESS_INFORMATION pi;
   memset(&si, 0, sizeof(si));
   memset(&pi, 0, sizeof(si));
   if(!CreateProcess((LPCSTR)prin_file, NULL, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi))
   {
       DWORD error = WSAGetLastError();
       getError(error);
       return -6;
   }
   closesocket(sub);
   closesocket(sock);
   WSACleanup();
   return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.11.2016, 04:39

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Загрузка файла с клиента на сервер
народ помогите ожалуйста разобраться.... написал следующий код.. сохраняю файл в папку с...

ftp server, передача файла с клиента на сервер и обратно
Появилась задача передавай файлы с клиента на сервер и обратно Для начала надо реализовать в одну...

ASP.NET MVC Как реализовать мониторинг загрузки файла на сервер у клиента?
Хочу реализовать отображение на стороне клиента информации о скорости и проценте загрузки файла на...

Клиент - сервер. Пересылка Bitmap
Задача такая: Захватить видео с вебкамеры на программе-сервере, добавить в последние биты каждого...


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

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

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