7 / 7 / 1
Регистрация: 16.10.2009
Сообщений: 11

Передача файла с помощью сокетов (UDP)

18.10.2009, 20:50. Показов 30749. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Пишу лабу по сокетам. Полностью задание звучит так:
Файл передается блоками размером в 1 КБ. В запросе указывается полный путь к файлу и номер блока. Для поиска доступных серверов используется широковещательная рассылка. Тип сервера: последовательный.
У меня возникла проблема с передачей файла блоками и заданием в запросе конкретного номера блока...

Собственно реализация... Буду рад любой помощи (желательно с кодом ) )))

Код Сервера
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
#include <stdio.h>
#include <winsock2.h> // Включаем использование сокетов
#include <windows.h>
#pragma comment(lib, "WSock32.lib") // Используем эту библиотеку
#pragma comment (lib, "mswsock.lib")
 
  #define PORT 666    // порт сервера
 
  int main(int argc, char* argv[])
  {
    char buff[1024];
 
    printf("Server start working...\n");
 
    //подключение библиотеки 
    if (WSAStartup(0x202,(WSADATA *) &buff[0]))
    {
      printf("WSAStartup error: %d\n",
             WSAGetLastError());
      return -1;
    }
 
    //создание сокета
    SOCKET my_sock;
    my_sock=socket(AF_INET,SOCK_DGRAM,0);
    if (my_sock==INVALID_SOCKET)
    {
      printf("Socket() error: %d\n",WSAGetLastError());
      WSACleanup();
      return -1;
    }
 
    //связывание сокета с локальным адресом 
    sockaddr_in local_addr;
    local_addr.sin_family=AF_INET;
    local_addr.sin_addr.s_addr=INADDR_ANY;
    local_addr.sin_port=htons(PORT);
 
    if (bind(my_sock,(sockaddr *) &local_addr,
        sizeof(local_addr)))
    {
      printf("bind error: %d\n",WSAGetLastError());
      closesocket(my_sock);
      WSACleanup();
      return -1;
    }
 
    //обработка пакетов, присланных клиентами
    while(1)
    {
      sockaddr_in client_addr;
      int client_addr_size = sizeof(client_addr);
      int bsize=recvfrom(my_sock,&buff[0],
        sizeof(buff)-1,0,
        (sockaddr *) &client_addr, &client_addr_size);
      if (bsize==SOCKET_ERROR)
      printf("recvfrom() error: %d\n",
             WSAGetLastError());
 
      // Определяем IP-адрес клиента и прочие атрибуты
      HOSTENT *hst;
      hst=gethostbyaddr((char *)
            &client_addr.sin_addr,4,AF_INET);
      printf("+%s [%s:%d] new DATAGRAM!\n",
      (hst)?hst->h_name:"Unknown host",
      inet_ntoa(client_addr.sin_addr),
      ntohs(client_addr.sin_port));
 
      // добавление завершающего нуля
      buff[bsize]=0;
 
      // Вывод на экран 
      printf("Client=>Server:%s\n",&buff[0]);
 
  FILE *file;
       char* file_name = buff;
    file_name[strlen(file_name) - 1] = '\0';
 
          file = fopen( file_name, "r" );
          if( file != 0 )
            {
     fgets( buff, sizeof(buff) , file );
            }
          else
            {
      printf("File not found !!!");
            }
     fclose(file);
 
      // посылка датаграммы клиенту
      sendto(my_sock,&buff[0],strlen(&buff[0]),0,
        (sockaddr *)&client_addr, sizeof(client_addr));
    }
    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
#include <stdio.h>
#include <string.h>
#include <winsock2.h> // Включаем использование сокетов
#include <windows.h>
 
   #pragma comment(lib, "WSock32.lib") // Используем эту библиотеку
   #pragma comment (lib, "mswsock.lib")
 
  #define PORT 666
  #define SERVERADDR "127.0.0.1"
  #define CLIENT_FILE "example.txt" //файл на клиенте
 
  int main(int argc, char* argv[])
  {
    char buff[10*1014];
    printf("Client stert working...\n");
 
    //иницилизация библиотеки Winsocks
    if (WSAStartup(0x202,(WSADATA *)&buff[0]))
    {
      printf("WSAStartup error: %d\n",
             WSAGetLastError());
      return -1;
    }
 
    //открытие сокета
    SOCKET my_sock=socket(AF_INET, SOCK_DGRAM, 0);
    if (my_sock==INVALID_SOCKET)
    {
      printf("socket() error: %d\n",WSAGetLastError());
      WSACleanup();
      return -1;
    }
 
    //обмен сообщений с сервером
    // установка возможности широковещательного адреса
    int i = 1;
    if (setsockopt(my_sock, SOL_SOCKET, SO_BROADCAST, (char *)&i, sizeof(i)) == -1)
    {
  printf ("Error setting broadcast socket\n");
  WSACleanup();
  return -1;
    }
    HOSTENT *hst;
    sockaddr_in dest_addr;
 
    dest_addr.sin_family=AF_INET;
    dest_addr.sin_port=htons(PORT);
 
    
    // определение IP-адреса узла
    if (inet_addr(SERVERADDR))
      dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);
    else
      if (hst=gethostbyname(SERVERADDR))
        dest_addr.sin_addr.s_addr=((unsigned long **)
              hst->h_addr_list)[0][0];
    else
      {
        printf("Unknown host: %d\n",WSAGetLastError());
        closesocket(my_sock);
        WSACleanup();
        return -1;
      }
     
 
    while(1)
    {
      // чтение сообщения с клавиатуры
      printf("\nClient=>Server:");fgets(&buff[0],sizeof(buff)-1,
             stdin);
      if (!strcmp(&buff[0],"quit\n")) break;
 
      // Передача сообщений на сервер
      sendto(my_sock,&buff[0],strlen(&buff[0]),0,
        (sockaddr *) &dest_addr,sizeof(dest_addr));
 
      // Прием сообщения с сервера
      sockaddr_in server_addr;
      int server_addr_size=sizeof(server_addr);
 
      int n=recvfrom(my_sock,&buff[0],sizeof(buff)-1,0,
        (sockaddr *) &server_addr, &server_addr_size);
 
      if (n==SOCKET_ERROR)
      {
        printf("recvfrom() error:"\
          "%d\n",WSAGetLastError());
        closesocket(my_sock);
        WSACleanup();
        return -1;
      }
 
      buff[n]=0;
 
      // Вывод принятого с сервера содержимого файла на экран
      printf("Client<=Server:%s",&buff[0]);
 
   FILE *file;
       char* file_name = CLIENT_FILE;
        file = fopen( file_name, "w" ); 
        fputs(buff, file );
        fclose( file );
    }
 
    //выход
    closesocket(my_sock);
    WSACleanup();
 
    return 0;
  }
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.10.2009, 20:50
Ответы с готовыми решениями:

Передача файла по локальной сети с помощью сокетов
Как организовать передачу файла по локальной сети с помощью сокетов? Что нужно писать в программе сервер и в программе клиент

Передача аудио потока с одного компьютера на другой с помощью ffmpeg и .net сокетов
Планирую передавать стримом аудио с одного компа на другой с помощью ffmpeg, который, вроде, входит в состав emgu cv(рядом нет пк, чтобы...

Чтение из буфера.Передача файла сокетов
Суть вопроса,что у меня не так??? рассказываю что есть,в общем прога отправляет данные,эт норм,но мне надо чтобы когда я...

8
7 / 7 / 1
Регистрация: 16.10.2009
Сообщений: 11
24.10.2009, 14:20  [ТС]
Переделал и оптимизировал свою лабу: теперь файл передается блоками. Но осталась небольшая загвоздка: как задать в запросе конкретный номер блока, а на принимающей стороне правильно его интерпретировать и отыскать?

Рассчитываю, что на данном форуме все же получу компетентную помощь...

Код клиента:
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
#include <stdio.h>
#include <string.h>
#include <winsock2.h> // Включаем использование сокетов
#include <windows.h>
 
   #pragma comment(lib, "WSock32.lib") // Используем эту библиотеку
   #pragma comment (lib, "mswsock.lib")
 
  #define PORT 15150
  #define SERVERADDR "127.0.0.1"
  #define CLIENT_FILE "example.txt" //файл на клиенте
  #define Line "File is recivied"
  int p;
 
#define Nsize 1024
  int main(int argc, char* argv[])
  {
    char buffer[30*Nsize];
    char buff[Nsize + 1];
    printf("Client stert working...\n");
 
    //иницилизация библиотеки Winsocks
    WSADATA WsaData;
    if( WSAStartup(0x0202, &WsaData) )
    {
        printf("Winsock cannot be started\r\n");
        return false;
    }
 
    //открытие сокета
    SOCKET my_sock=socket(AF_INET, SOCK_DGRAM, 0);
    if (my_sock==INVALID_SOCKET)
    {
      printf("socket() error: %d\n",WSAGetLastError());
      WSACleanup();
      return -1;
    }
 
    //обмен сообщений с сервером
    // установка возможности широковещательного адреса
    int i = 1;
    if (setsockopt(my_sock, SOL_SOCKET, SO_BROADCAST, (char *)&i, sizeof(i)) == -1)
    {
        printf ("Error setting broadcast socket\n");
        WSACleanup();
        return -1;
    }
    HOSTENT *hst;
    sockaddr_in dest_addr;
    memset(&dest_addr, 0, sizeof(sockaddr_in));
    dest_addr.sin_family=AF_INET;
    dest_addr.sin_port=htons(PORT);
 
    
    // определение IP-адреса узла
    if (inet_addr(SERVERADDR))
      dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);
    else
      if (hst=gethostbyname(SERVERADDR))
        dest_addr.sin_addr.s_addr=((unsigned long **)
              hst->h_addr_list)[0][0];
    else
      {
        printf("Unknown host: %d\n",WSAGetLastError());
        closesocket(my_sock);
        WSACleanup();
        return -1;
      }
     
 
    while(1)
    {
      // чтение сообщения с клавиатуры
      printf("\nClient=>Server:");
      scanf("%s", buff);
      //fgets(&buff[0],sizeof(buff)-1, stdin);
      if (!strcmp(buff,"quit\n")) break;
 
      // Передача сообщений на сервер
      sendto(my_sock, buff, strlen(buff), 0, (sockaddr *) &dest_addr,sizeof(sockaddr_in));
 
      // Прием сообщения с сервера
      sockaddr_in server_addr;
      int server_addr_size=sizeof(server_addr);
      char* line = Line;
      p = 0;
 
      while(*buff!=*line)
      //do
          {
              memset(buff, 0, Nsize);
              int n=recvfrom(my_sock,&buff[0],Nsize + 1,0,
               (sockaddr *) &server_addr, &server_addr_size);
 
                printf("Was recieved bytes %d\n",n);
      
                if (n==SOCKET_ERROR)
                {
                   printf("recvfrom() error:"\
                   "%d\n",WSAGetLastError());
                   closesocket(my_sock);
                   WSACleanup();
                   return -1;
                }
                buff[n]=0;
                if(*buff!=*line)
                {
                for(int i=0;i<strlen(buff);i++)
                {
                  buffer[p+i] = buff[i];
                  //p += sizeof(buff);
                }
                
                p+=n;
                buffer[p]=0;
                //buffer[strlen(buff)]=0;
                //buffer[strlen(buff) - 1] = '\0';
                }
                //else buffer[p]=0;
 
           } 
          //while(*buff!=*line) ;
 
      // Вывод принятого с сервера сообщения об успешной операции на экран
      printf("Client<=Server:%s",&buff[0]);
 
      FILE *file;
      char* file_name = CLIENT_FILE;
        file = fopen( file_name, "w" ); 
        fputs(buffer, file );
        memset(buffer, 0, 30*Nsize * sizeof(char));
        fclose( file );
    }
 
    //выход
    closesocket(my_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
#include <stdio.h>
#include <winsock2.h> // Включаем использование сокетов
#include <windows.h>
#pragma comment(lib, "WSock32.lib") // Используем эту библиотеку
#pragma comment (lib, "mswsock.lib")
 
  #define PORT 15150    // порт сервера
  #define Line "File is recivied"
  #define slash "|" 
#define N 1024
 
  int main(int argc, char* argv[])
  {
    char buff[N];
 
    printf("Server start working...\n");
 
    //подключение библиотеки 
    WSADATA WsaData;
    if( WSAStartup(0x0202, &WsaData) )
    {
        printf("Winsock cannot be started\r\n");
        return false;
    }
    //создание сокета
    SOCKET my_sock;
    my_sock=socket(AF_INET,SOCK_DGRAM,0);
    if (my_sock==INVALID_SOCKET)
    {
      printf("Socket() error: %d\n",WSAGetLastError());
      WSACleanup();
      return -1;
    }
 
    //связывание сокета с локальным адресом 
    sockaddr_in local_addr;
    memset(&local_addr, 0, sizeof(sockaddr_in));
    local_addr.sin_family=AF_INET;
    local_addr.sin_addr.s_addr=INADDR_ANY;
    local_addr.sin_port=htons(PORT);
 
    if (bind(my_sock,(sockaddr *) &local_addr, sizeof(local_addr)))
    {
      printf("bind error: %d\n",WSAGetLastError());
      closesocket(my_sock);
      WSACleanup();
      return -1;
    }
 
    //обработка пакетов, присланных клиентами
    while(1)
    {
      sockaddr_in client_addr;
      memset(&client_addr, 0, sizeof(sockaddr_in));
      int client_addr_size = sizeof(sockaddr_in);
      int bsize=recvfrom(my_sock, buff, N * sizeof(char), 0, (sockaddr *) &client_addr, &client_addr_size);
      if (bsize==SOCKET_ERROR)
      {
            printf("recvfrom() error: %d\n", WSAGetLastError());
            break;
      }
 
      // Определяем IP-адрес клиента и прочие атрибуты
      HOSTENT *hst;
      hst=gethostbyaddr((char *)&client_addr.sin_addr,4,AF_INET);
      printf("+%s [%s:%d] new DATAGRAM!\n",(hst)?hst->h_name:"Unknown host",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
 
      // добавление завершающего нуля
      buff[bsize]=0;
 
      // Вывод на экран 
      printf("Client=>Server:%s\n",buff);
 
      FILE *file;
      char* file_name = buff;
      //file_name[strlen(file_name) - 1] = '\0';
      file = fopen( file_name, "r" );
      if( file != 0 )
      {
//            int N = 1024;
            char buffer[N + 1];
            fseek(file,0,2);
            int filesize = ftell(file);
            fseek(file,0,0);
            int filemarker = 0;
            fseek(file,filemarker,0);
            int szee = N;
 
             while (szee == N)
            {
              printf("Recieve file - ");
              memset(buffer, 0, N);
              szee = fread(buffer, sizeof(char), N, file);
              //buffer[szee - 1] = '\0';
 
              sendto(my_sock,&buffer[0],szee,0,
              (sockaddr *)&client_addr, sizeof(client_addr));
              printf("filemarker = %d of filesize = %d \n", filemarker, filesize);
              filemarker += szee;
            }
             char* line = Line;
             sendto(my_sock,&line[0],strlen(&line[0]),0,
              (sockaddr *)&client_addr, sizeof(client_addr));
 
          fclose(file);
        }
               else
            {
               printf("File not found !!!");
            }
    }
    system("PAUSE");
    return 0;
  }
0
7 / 7 / 1
Регистрация: 16.10.2009
Сообщений: 11
27.10.2009, 14:10  [ТС]
Лучший ответ Сообщение было отмечено как решение

Решение

Мда...... Складывается такое впечатление, что я общаюсь сам с собой........ (((((((((((

Тем не менее я все же сумел доделать свою лабу. Окончательный вариант выглядит следующим образом. (может пригодится тем, кто так же не может ни до кого достучаться... )

Код клиента:
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
#include <stdio.h>
#include <string.h>
#include <winsock2.h> // Включаем использование сокетов
#include <windows.h>
#include <memory.h>
#include <string.h>
 
   #pragma comment(lib, "WSock32.lib") // Используем эту библиотеку
   #pragma comment (lib, "mswsock.lib")
 
  #define PORT 15150
  #define SERVERADDR "127.0.0.1"
  #define CLIENT_FILE "example.txt" //файл на клиенте
  #define Line "File is recivied"
  int p;
 
#define Nsize 1024
  int main(int argc, char* argv[])
  {
    char buffer[30*Nsize];
    char buff[Nsize + 1];
    printf("Client start working...\n");
 
    //иницилизация библиотеки Winsocks
    WSADATA WsaData;
    if( WSAStartup(0x0202, &WsaData) )
    {
        printf("Winsock cannot be started\r\n");
        return false;
    }
 
    //открытие сокета
    SOCKET my_sock=socket(AF_INET, SOCK_DGRAM, 0);
    if (my_sock==INVALID_SOCKET)
    {
      printf("socket() error: %d\n",WSAGetLastError());
      WSACleanup();
      return -1;
    }
 
    //обмен сообщений с сервером
    // установка возможности широковещательного адреса
    int i = 1;
    if (setsockopt(my_sock, SOL_SOCKET, SO_BROADCAST, (char *)&i, sizeof(i)) == -1)
    {
        printf ("Error setting broadcast socket\n");
        WSACleanup();
        return -1;
    }
    HOSTENT *hst;
    sockaddr_in dest_addr;
    memset(&dest_addr, 0, sizeof(sockaddr_in));
    dest_addr.sin_family=AF_INET;
    dest_addr.sin_port=htons(PORT);
 
    
    // определение IP-адреса узла
    if (inet_addr(SERVERADDR))
      dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);
    else
      if (hst=gethostbyname(SERVERADDR))
        dest_addr.sin_addr.s_addr=((unsigned long **)
              hst->h_addr_list)[0][0];
    else
      {
        printf("Unknown host: %d\n",WSAGetLastError());
        closesocket(my_sock);
        WSACleanup();
        return -1;
      }
     
 
    while(1)
    {
      // чтение сообщения с клавиатуры
      printf("\nClient=>Server:");
      scanf("%s", buff);
      if (!strcmp(buff,"quit\n")) break;
 
      int N=30;
      printf("Number of block is:");
      scanf("%d", &N);
      char blockN[3];
      sprintf(blockN, "%3d", N);
      char tBuf[53];
      memcpy((void*)tBuf, (void*)blockN, 3); // в первые 3 символа пишем N
      memcpy((void*)(tBuf+3), (void*)buff, 50); // пишем в tBuf содержимое buff
 
      // Передача сообщений на сервер
      sendto(my_sock, tBuf, strlen(tBuf), 0, (sockaddr *) &dest_addr,sizeof(sockaddr_in));
 
      // Прием сообщения с сервера
      sockaddr_in server_addr;
      int server_addr_size=sizeof(server_addr);
      char* line = Line;
      p = 0;
 
      while(*buff!=*line)
          {
              memset(buff, 0, Nsize);
              int n=recvfrom(my_sock,&buff[0],Nsize + 1,0,
               (sockaddr *) &server_addr, &server_addr_size);
 
                printf("Was recieved bytes %d\n",n);
      
                if (n==SOCKET_ERROR)
                {
                   printf("recvfrom() error:"\
                   "%d\n",WSAGetLastError());
                   closesocket(my_sock);
                   WSACleanup();
                   return -1;
                }
                buff[n]=0;
                if(*buff!=*line)
                {
                for(int i=0;i<strlen(buff);i++)
                {
                  buffer[p+i] = buff[i];
                }
                
                p+=n;
                buffer[p]=0;
                }
           } 
 
      // Вывод принятого с сервера сообщения об успешной операции на экран
      printf("Client<=Server:%s",&buff[0]);
 
      FILE *file;
      char* file_name = CLIENT_FILE;
        file = fopen( file_name, "w" ); 
        fputs(buffer, file );
        memset(buffer, 0, 30*Nsize * sizeof(char));
        fclose( file );
    }
 
    //выход
    closesocket(my_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
118
#include <stdio.h>
#include <winsock2.h> // Включаем использование сокетов
#include <windows.h>
#include <memory.h>
#include <string.h>
#pragma comment(lib, "WSock32.lib") // Используем эту библиотеку
#pragma comment (lib, "mswsock.lib")
 
  #define PORT 15150    // порт сервера
  #define Line "File is recivied"
  #define Nsize 1024
 
  int main(int argc, char* argv[])
  {
    char buff[Nsize];
 
    printf("Server start working...\n");
 
    //подключение библиотеки 
    WSADATA WsaData;
    if( WSAStartup(0x0202, &WsaData) )
    {
        printf("Winsock cannot be started\r\n");
        return false;
    }
    //создание сокета
    SOCKET my_sock;
    my_sock=socket(AF_INET,SOCK_DGRAM,0);
    if (my_sock==INVALID_SOCKET)
    {
      printf("Socket() error: %d\n",WSAGetLastError());
      WSACleanup();
      return -1;
    }
 
    //связывание сокета с локальным адресом 
    sockaddr_in local_addr;
    memset(&local_addr, 0, sizeof(sockaddr_in));
    local_addr.sin_family=AF_INET;
    local_addr.sin_addr.s_addr=INADDR_ANY;
    local_addr.sin_port=htons(PORT);
 
    if (bind(my_sock,(sockaddr *) &local_addr, sizeof(local_addr)))
    {
      printf("bind error: %d\n",WSAGetLastError());
      closesocket(my_sock);
      WSACleanup();
      return -1;
    }
 
    //обработка пакетов, присланных клиентами
    while(1)
    {
      char tBuf[53];
      sockaddr_in client_addr;
      memset(&client_addr, 0, sizeof(sockaddr_in));
      int client_addr_size = sizeof(sockaddr_in);
      int bsize=recvfrom(my_sock, tBuf, Nsize * sizeof(char), 0, (sockaddr *) &client_addr, &client_addr_size);
      if (bsize==SOCKET_ERROR)
      {
            printf("recvfrom() error: %d\n", WSAGetLastError());
            break;
      }
 
      // Определяем IP-адрес клиента и прочие атрибуты
      HOSTENT *hst;
      hst=gethostbyaddr((char *)&client_addr.sin_addr,4,AF_INET);
      printf("+%s [%s:%d] new DATAGRAM!\n",(hst)?hst->h_name:"Unknown host",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
 
       char blockN[3];
       memcpy((void*)blockN, (void*)tBuf, 3);
       memcpy((void*)buff, (void*)(tBuf+3), 50); //выделztv содержимое buff  
       int N = atoi(blockN); //определяем N
       printf("\nNumber of block is:%d\n", N);
 
      // добавление завершающего нуля
      buff[bsize-3]=0;
 
      // Вывод на экран 
      printf("Client=>Server:%s\n",buff);
 
      FILE *file;
      char* file_name = buff;
      file = fopen( file_name, "r" );
      if( file != 0 )
      {
            char buffer[Nsize + 1];
            fseek(file,0,2);
            int filesize = ftell(file);
            int filemarker = 0;
            fseek(file,Nsize*N,0);
            int szee = Nsize;
 
             while (szee == Nsize)
            {
              printf("Recieve file - ");
              memset(buffer, 0, Nsize);
              szee = fread(buffer, sizeof(char), Nsize, file);
 
              sendto(my_sock,&buffer[0],szee,0,
              (sockaddr *)&client_addr, sizeof(client_addr));
              printf("filemarker = %d of filesize = %d \n", filemarker, filesize);
              filemarker += szee;
            }
             char* line = Line;
             sendto(my_sock,&line[0],strlen(&line[0]),0,
              (sockaddr *)&client_addr, sizeof(client_addr));
 
          fclose(file);
        }
               else
            {
               printf("File not found !!!");
            }
    }
    system("PAUSE");
    return 0;
  }
7
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.10.2009, 15:23
Цитата Сообщение от alex_uni Посмотреть сообщение
Мда...... Складывается такое впечатление, что я общаюсь сам с собой...
И вправду)
Просто эта тема настолько обглоданая, что напоминает день сурка. Никому не нравится много раз делать одно и то же.
2
0 / 0 / 0
Регистрация: 24.09.2011
Сообщений: 13
22.10.2011, 18:16
Привет alex_uni, Не мог бы ты порекомендовать книги по которым ты учил это все. Спасибо
0
7 / 7 / 1
Регистрация: 16.10.2009
Сообщений: 11
22.10.2011, 19:55  [ТС]
Привет alex_uni, Не мог бы ты порекомендовать книги по которым ты учил это все. Спасибо
методы моего Белорусского радиотехнического универа))
0
0 / 0 / 0
Регистрация: 24.09.2011
Сообщений: 13
22.10.2011, 21:09
круто-круто, возможно где-то можна найти методички по ваших лабах, было б тож не плохо)
0
0 / 0 / 0
Регистрация: 13.04.2014
Сообщений: 10
18.05.2014, 09:39
alex_uni, что за номер блока? что мне писать в клиенте после запуска? пытался всяко говорит file not found
0
0 / 0 / 0
Регистрация: 11.08.2016
Сообщений: 19
12.08.2016, 00:30
это конечно старый топик но всетаки, броадкаст почему то не хочет принимать сервер.
только если шлем на его именно адрес.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.08.2016, 00:30
Помогаю со студенческими работами здесь

Передача файла по udp
Всех приветствую! Как передать файл по udp больше 8кб? Как пишут на различных источниках нужно его порезать и передать. Не совсем...

Передача файла по udp
Здравствуйте. Пробую передать файл с &quot;клиента&quot; на &quot;сервер&quot;. Отправка файла от клиента: void MainWindow::send_file() { quint8...

Передача файла по протоколу UDP
Сервер передает файл клиенту если его размер файла больше 8192 байта то файл разбивается на части. С этим все в порядке но вот со...

Работа нескольких UDP сокетов с 1м портом
Здравствуйте, возникла у меня такая проблемка: есть 2+ программы, расположенные на одной машине, которые должны читать данные с одного и...

Отправка сокетов в виде массивов по UDP-протоколу
Читающим доброе время суток, вот хочу обратиться за помощью. Суть проблемы состоит в отправка сокетов в виде массивов по...


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

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

Новые блоги и статьи
Тестирование Pull Request в Kubernetes с vCluster
Mr. Docker 19.07.2025
Часто сталкиваюсь с серьезной дилемой при настройке тестовых окружений для проверки Pull Request в Kubernetes. С одной стороны, каждый PR требует изолированной среды — только так можно гарантировать,. . .
Мой 7 минутный ролик с крамольным предложением про шахматы, предлагаю заценить
_Ivana 18.07.2025
p2UhJNMGY94
Десять Middleware Node.js для эффективного кодинга
Reangularity 18.07.2025
Когда я только начинал работать с Node. js, количество пакетов в npm меня буквально парализовало. Сегодня их больше 1,3 миллиона — попробуй разберись, что стоит твоего внимания, а что нет. Я потратил. . .
Context и глубины Android
mobDevWorks 18.07.2025
В Android разработки Context напоминает воздух - он везде, жизненно необходим, но мало кто может детально объяснить его природу. Мы привыкли получать его как параметр, передавать дальше и. . .
Результаты исследования от команды MCM (июль 2025 г.)
Programma_Boinc 18.07.2025
Результаты исследования от команды MCM (июль 2025 г. ) Как сообщалось в наших предыдущих публикациях, мы изучаем гены, которые имеют наибольший рейтинг и ассоциируются с различными видами рака, в. . .
ИИ-чатбот на React с OpenAI и LangChain.js
Reangularity 17.07.2025
React давно стал для меня золотым стандартом фронтенд-разработки. Его компонентная структура, виртуальный DOM и однонаправленный поток данных идеально подходят для создания динамичных интерфейсов. . .
Пишем адаптер для локального хранилища S3 на C#
stackOverflow 16.07.2025
Разработка современных приложений часто требует интеграции с объектными хранилищами, и Amazon S3 стал де-факто стандартом в этой области. Однако работа с облачными сервисами в процессе разработки. . .
Старые замки
kumehtar 16.07.2025
Смотрел тут фото, попались пара старых замков. И сразу бросилось в глаза из отличие. Например: Замок Бистон, в англии. Разрушенное сооружение. Но - не испорченное людьми, по крайней мере - на. . .
Java и Eclipse Store: Сверхбыстрые приложения с In-Memory DB
Javaican 15.07.2025
Eclipse Store — это микро-движок персистентности для Java, который позволяет хранить и извлекать нативные Java-объекты без необходимости преобразования данных или использования объектно-реляционного. . .
EmBitz, создание проекта, отладка, прошивка
locm 15.07.2025
Создание проекта для Blue Pill (STM32F103C8T6) в EmBitz 2. 30, написания кода blink, запуск отладки в ОЗУ, заливка релизной прошивки во flash используя ST-Link и др. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru