Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
3 / 3 / 1
Регистрация: 26.12.2019
Сообщений: 170

Клиент Серверное приложение

07.06.2021, 22:28. Показов 1439. Ответов 8

Студворк — интернет-сервис помощи студентам
Суть программы в том что есть сервер и клиетн и сервер отправляет по UDP клиенту однако клиент выдает ошибку
recvfrom: Connection reset by peer
как исправить?
Клиент
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
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
 
#define SADDR struct sockaddr
#define SIZE sizeof(struct sockaddr_in)
#define SLEN sizeof(struct sockaddr_in)
 
int main(int argc, char *argv[]) {
  if (argc != 4) {
    printf("You must use 3 arguments: [server IP address] [port] [buffersize] \n");
    exit(1);
  }
 
  int i;
  for(i = 1; i < argc; ++i)
  {
    if(atoi(argv[i]) < 1){
      printf("Args can't be smaller than 1\n");
      exit(1);
    }
  }
  
 
  int fd;
  int nread;
  int BUFSIZE = atoi(argv[3]);
  int SERV_PORT = atoi(argv[2]);
  char buf[BUFSIZE];
  struct sockaddr_in servaddr;
    // start TCP-------------------------------------------------------
  if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
    perror("socket creating");
    exit(1);
  }
 
  memset(&servaddr, 0, SIZE);
  servaddr.sin_family = AF_INET;
 
  if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) {
    perror("bad address");
    exit(1);
  }
 
  servaddr.sin_port = htons(SERV_PORT);
 
  if (connect(fd, (SADDR *)&servaddr, SIZE) < 0) {
    perror("connect");
    exit(1);
  }
 
  int sockfd, n;
  int cntTotal = 0;
  char sendline[BUFSIZE], recvline[BUFSIZE + 1];
  struct sockaddr_in servaddrUDP;
 
  memset(&servaddrUDP, 0, sizeof(servaddrUDP));
  servaddrUDP.sin_family = AF_INET;
  servaddrUDP.sin_port = htons(SERV_PORT);
 
  if (inet_pton(AF_INET, argv[1], &servaddrUDP.sin_addr) < 0) {
    perror("inet_pton problem");
    exit(1);
  }
  if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
    perror("socket problem");
    exit(1);
  }
    printf("CONNECT\n");
 
  while (1) {
    unsigned int len = SLEN;
    int j = 0;
    for(; j < SLEN; ++j){
        buf[j] = '\0';
    }
 
    if ((n = recvfrom(sockfd, sendline, BUFSIZE, 0, (SADDR *)&servaddrUDP, &len)) < 0) {
      perror("recvfrom");
      exit(1);
    }
    cntTotal++;
    sleep(1);
    printf("\n%s => %d\n", buf, cntTotal);
 
    if(strcmp(buf, "stop")==0)
    {
        printf("SSSSSS");
        break;
    }
  }
  printf("%d",cntTotal);
  close(sockfd);
  close(fd);
  exit(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
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
 
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
 
#define SADDR struct sockaddr
#define SLEN sizeof(struct sockaddr_in)
 
int main(int argc, char *argv[]) {
 
  if (argc != 3) {
    printf("You must use 2 arguments: [server port] [buffersize] \n");
    exit(1);
  }
 
  int i;
  for(i = 1; i < argc; ++i)
  {
    if(atoi(argv[i]) < 1){
      printf("Args can't be smaller than 1\n");
      exit(1);
    }
  }
 
  const size_t kSize = sizeof(struct sockaddr_in);
 
  int lfd, cfd;
  int nread;
  int SERV_PORT = atoi(argv[1]);
  int BUFSIZE = atoi(argv[2]);
  char buf[BUFSIZE];
  struct sockaddr_in servaddr;
  struct sockaddr_in cliaddr;
 
  if ((lfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
    perror("socket");
    exit(1);
  }
 
  memset(&servaddr, 0, kSize);
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  servaddr.sin_port = htons(SERV_PORT);
 
  if (bind(lfd, (SADDR *)&servaddr, kSize) < 0) {
    perror("bind");
    exit(1);
  }
 
  if (listen(lfd, 5) < 0) {
    perror("listen");
    exit(1);
  }
 
 
 //start udp---------------------------------------------------------
  int fd;
  int cntTotal = 0;
  int sockfd, n;
  struct sockaddr_in servaddrUdp;
  struct sockaddr_in cliaddrUdp;
  if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
    perror("socket problem");
    exit(1);
  }
  memset(&servaddrUdp, 0, SLEN);
  cliaddrUdp.sin_family = AF_INET;
  cliaddrUdp.sin_addr.s_addr = htonl(INADDR_ANY);
  cliaddrUdp.sin_port = htons(SERV_PORT);
  
  if (bind(sockfd, (SADDR *)&servaddrUdp, SLEN) < 0) {
    perror("bind problem");
    exit(1);
  }
  printf("SERVER starts...\n");
 
 
    int num = 0;
    
 
  write(1, "Input number to send\n", 22);
  while ((nread = read(0, buf, BUFSIZE)) > 0) {
    num = atoi(buf);
    if (write(fd, buf, nread) < 0) {
      perror("write");
      exit(1);
    }
    break;
  }
  char sendline[BUFSIZE], recvline[BUFSIZE + 1];
 
  memset(&servaddrUdp, 0, sizeof(servaddrUdp));
  servaddrUdp.sin_family = AF_INET;
  servaddrUdp.sin_port = htons(SERV_PORT);
 
  if (inet_pton(AF_INET, argv[1], &cliaddrUdp.sin_addr) < 0) {
    perror("inet_pton problem");
    exit(1);
  }
  if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
    perror("socket problem");
    exit(1);
  }
 
  for(i = 1; i <= num; ++i){
      int j = 0;
      for(j = 0; j < BUFSIZE; ++j)
        sendline[j] = '\0';
      snprintf(sendline, BUFSIZE, "%d", i);
      
        printf("%s\n", sendline);
 
    if (sendto(sockfd, sendline, BUFSIZE-1, 0, (SADDR *)&cliaddrUdp, SLEN) == -1) {
      perror("sendto problem");
      exit(1);
    }
 
  }
    if (sendto(sockfd, "stop", BUFSIZE-1, 0, (SADDR *)&cliaddrUdp, SLEN) == -1) {
      perror("sendto problem");
      exit(1);
    }
    
  close(sockfd);
  close(fd);
  exit(0);
}
  
 
//end udp-------------------------------------------------------------------
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.06.2021, 22:28
Ответы с готовыми решениями:

Прокомментировать клиент-серверное приложение
здаврствуйте, нужна ваша помошь. есть клиент-серверное приложение. И то и другое полностью работает на как я не понимаю. Кто может...

Клиент-серверное приложение на С с использованием RPC
Имеется такая проблема. С использованием RPC реализовать клиент-серверное приложение. На вход клиенту задается имя файла, которое...

Клиент/серверное приложение используя очереди сообщений
Написать код для реализации системы Клиент / Сервер. Сервер получает сообщение от клиентов, тип сообщения задается при запуске клиента...

8
13 / 13 / 0
Регистрация: 21.10.2011
Сообщений: 58
08.06.2021, 15:06
а где ваш accept() ?

сервер должен формироваться по алгоритму:

1) создание сокета (socket())
2) привязка к интерфейсу и порту (bind())
3) старт сокета (listen())

дальше нужен примерно такой цикл:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
while ((conn = accept (sock, (struct sockaddr *) &address, &addrlen)) >= 0) { // принимает новое соединение
           char buff[1024];
           int amount;
           while ((amount = read (conn, buff, sizeof (buff))) > 0) { // читаем из сокета, не более sizeof(buff)
           if (write (1, buff, amount) != amount) { // пишем буфер на stdout (дескриптор 1) - это для примера
                           perror ("write");
                           exit (1);
                   }
            }
            if (amount < 0) {
                   perror ("read");
                   exit (1);
            }
}
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
09.06.2021, 09:32
Цитата Сообщение от ArtoriasDark Посмотреть сообщение
по UDP клиенту однако клиент выдает ошибку
recvfrom: Connection reset by peer
Что-то вы не то говорите или показываете. У клиента между созданием udp сокета и вызовом recvfrom() нет ни bind()/connect()/sendto() соответственно клиент в принципе ничего не получит и должен вечно висеть в этом recvfrom()
0
3 / 3 / 1
Регистрация: 26.12.2019
Сообщений: 170
09.06.2021, 18:04  [ТС]
Можете тогда пожалуйста максимально подробно объяснить как сделать клиент и сервер так чтобы тсп клинт получал от сервера по юдп что-то. Я просто вообще не понимаю как это работает
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
09.06.2021, 19:41
Цитата Сообщение от ArtoriasDark Посмотреть сообщение
чтобы тсп клинт получал от сервера по юдп что-то.
Вам хочется в одной программе иметь TCP и UDP сокеты как например в DNS или SIP?
0
3 / 3 / 1
Регистрация: 26.12.2019
Сообщений: 170
10.06.2021, 19:50  [ТС]
честно я не знаю, суть задания которое мне высрали звучит как то так:
ТСП клиент говорит серверу, привет вот адрес, дай что-то.​
Сервер говорит окей принимай и отсылает по УДП.
Клиент говорит что принял. все.

И я вообще не понимаю как это делать

Добавлено через 1 час 51 минуту
попытался с нуля написать
Сервер
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
#include <sys/socket.h>
#include <sys/types.h>
#include <errno.h>
#include <stdlib.h>
#include <arpa/inet.h>
 
 
int main(){
  int server_fd=socket(AF_INET,SOCKSTREAM,0);
  if(serverfd<0){
    perror("Socket failure");
    exit(EXIT_FAILURE);
  }
  struct sockaddr_in server={0};
  server.sin_family=AF_INET;
  server.sin_port=htons(3);
  server.sin_addr.s_addr = htonl(INADDR_ANY);
  struct sockaddr_in server_udp={0};
  server_udp.sin_family=AF_INET;
  server_udp.sin_port=htons(3);
  server_udp.sin_addr.s_addr = htonl(INADDR_ANY);
  if(bind(server_fd,(struct sockaddr*)&server,sizeof(server))<0){
    perror("Bind error");
    exit(EXIT_FAILURE);
  }
  int listen_fd=listen(server_fd,1);
  if(listen_fd<0){
    perror("Listening failure");
    exit(EXIT_FAILURE);
  }
  struct sockaddr_in client={0};
  client.sin_family=AF_INET;
  socklen_t size_of_client=sizeof(client);
  int client_fd=accept(server_fd,(struct scokaddr*)&client,&size_of_client);
  if(client_fd<0){
    perror("Acception failure");
    exit(EXIT_FAILURE);
  }
  const int SIZE=sizeof(server_udp.sin_addr.s_addr)+1;
  char address[SIZE];
  address=server_udp.sin_addr.s_addr;
  address[SIZE]='\0';
  if(send(server_fd,buffer,SIZE,0)<0){
    perror("Sending failure");
    exit(EXIT_FAILURE);
  }
  server_fd=socket(AF_INET,SOCK_DGRAM,0);
  if(bind(server_fd,(struct sockaddr*)&server_udp,sizeof(server))<0){
    perror("Bind error");
    exit(EXIT_FAILURE);
  }
  listen_fd=listen(server_fd,1);
  if(listen_fd<0){
    perror("Listening failure");
    exit(EXIT_FAILURE);
  }
  struct sockaddr_in client={0};
  client.sin_family=AF_INET;
  socklen_t size_of_client=sizeof(client);
  int client_fd=accept(server_fd,(struct scokaddr*)&client,&size_of_client);
//дописать
 
}

КЛИЕНТ
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
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <>
 
int main(){
  int client_fd=socket(AF_INET,SOCK_STREAM,0);
  if(client_fd<0){
    perror("socket_failure");
    exit(EXIT_FAILURE);
  }
  struct sockaddr_in servaddr={0};
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    servaddr.sin_port = htons(3);
    scoklen_t size_of_server=sizeof(servaddr);
    if(connect(client_fd,(struct sockaddr*)&servaddr,&size_of_server)<0){
      perror("Connect error");
      exit(EXIT_FAILURE);
    }
    const int SIZE=256;
    char address[SIZE];
    bytes_red=recv(client_fd,address,SIZE,0);
    if(bytes_red<0){
      perror("Reading ERROR");
      exit(EXIT_FAILURE);
    }
    close(client_fd);
    client_fd=socket(AF_INET,SOCK_DGRM,0);
    
    //дописать
}
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
10.06.2021, 21:16
Цитата Сообщение от ArtoriasDark Посмотреть сообщение
попытался с нуля написать
Дальше попытки писать в listen сокет читать не стал, это какая-то каша.
0
3 / 3 / 1
Регистрация: 26.12.2019
Сообщений: 170
10.06.2021, 21:40  [ТС]
извините, но я плохо знаю, можете помочь, а то это как то сдавать нужно.
0
3 / 3 / 1
Регистрация: 26.12.2019
Сообщений: 170
12.06.2021, 01:20  [ТС]
Сделайте пожалуйста, хотя бы работающий сервер и клиент(как в задании) а отправку я уже как нибудь сам
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.06.2021, 01:20
Помогаю со студенческими работами здесь

Как написать клиент-серверное приложение?
Хочу написать такую программу. Есть сервер у меня на компютере и есть клиент на другом компютере. Клиент посылает какую-то строку серверу а...

Клиент-Серверное приложение. Как сделать, чтобы сервер сам отправлял сообщения на клиент
Добрый день всем. Проблема заключается в следующем: Есть клиент-серверное приложение, хочу реализовать своего рода защиту, чтобы при...

Клиент-серверное приложение. Сервер - ПК, клиент - телефон (Android)
Здравствуйте, решил для обучения написать программу для выключения ПК с телефона, используя компонент TIdTCPServer. Подскажите, как...

Клиент-серверное приложение: как определить, что сервер/клиент не отвечает в течении определенного времени
Пишу клиент-серверное приложение. Использую TCPListener и TCPClient. Вопрос: как определить что сервер(клиент) не отвечает в течении...

Клиент серверное приложение
Ребят вообщем нужно написать клиент серверное приложение в консоле. Как писать с чего начать понятия не имею, программу не прошу что-бы...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru