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

Сервер не отправляет значения клиенту

15.02.2022, 23:59. Показов 3661. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Уже как 2 часа не могу понять, почему сервер не отправляет значения элемента factorial клиенту.

Реализация:
Сервер:
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
#define _CRT_SECURE_NO_WARNINGS
 
#include <winsock2.h>
#include <iostream>
#include <stdlib.h>
#include <process.h>
#include <Windows.h>
 
using namespace std;
 
#pragma comment (lib, "ws2_32.lib")
 
int main() {
 
    WORD wVersionRequested;
    WSADATA wsaData;
 
    //int err;
 
    wVersionRequested = MAKEWORD(2, 2);
    WSAStartup(wVersionRequested, &wsaData);
    SOCKET s;
    s = socket(AF_INET, SOCK_STREAM, 0);
 
    struct sockaddr_in local;
 
 
    local.sin_port = htons(1280);
    local.sin_family = AF_INET;
    local.sin_addr.s_addr = htonl(INADDR_ANY);
 
    int c = bind(s, (struct sockaddr*)&local, sizeof(local));
 
    int r = listen(s, 5);
 
    while (true) {
        char res[100], b[255], * Res;
        sockaddr_in remote_addr;
 
        int size = sizeof(remote_addr);
 
        SOCKET s2 = accept(s, (struct sockaddr*)&remote_addr, &size);
 
        while (recv(s2, b, sizeof(b), 0) != 0) {
 
            char x[100], y[100];
            int i = 0, i_y = 0;
            int f = 1, f2 = 1;
            bool flag = false;
            while (true) {
                if (flag == false) {
 
                    if (b[i] != ',') { x[i] = b[i]; i++; }
                    else { flag = true; i++; }
                }
                else
                {
                    if (b[i] == NULL) { break; }
                    else { y[i_y] = b[i]; i_y++; i++; }
                }
            }
 
            int num_x = atoi(x);
            int num_y = atoi(y);
 
            
 
            for (int o = 1; o <= num_x; o++)
            {
                f *= o;
            }
 
            for (int p = 1; p <= num_y; p++)
            {
                f2 *= p;
            }
 
            int factorial = f + f2;
 
            _itoa(factorial, res, 10); /* значения факториала значений m и n записываются в res, который является типом char *. Я вводил значения 4,5 их факториал равен 144*/
 
            Res = new char[strlen(res) + 1];
 
            strcpy(Res, res);
 
            Res[strlen(res)] = '\0';
 
            send(s2, Res, sizeof(Res) - 2, 0);
 
            closesocket(s2);
        }
    }
    WSACleanup();
 
}
Клиент:
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
#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
 
#include <winsock2.h>
#include <iostream>
#include <stdlib.h>
#include <process.h>
#include <Windows.h>
#include <algorithm>
 
 
 
using namespace std;
 
#pragma comment (lib, "ws2_32.lib")
 
int main() {
 
    setlocale(LC_ALL, "Russian");
 
    WORD wVersionRequested;
    WSADATA wsaData;
 
    wVersionRequested = MAKEWORD(2, 2);
    WSAStartup(wVersionRequested, &wsaData);
 
    struct sockaddr_in peer;
 
    peer.sin_family = AF_INET;
    peer.sin_port = htons(1280);
    peer.sin_addr.s_addr = inet_addr("127.0.0.1");
 
    SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
 
    connect(s, (struct sockaddr*)&peer, sizeof(peer));
 
    char buf[255], b[255];
 
 
    cout << "Enter m and n type {m,n}:" << endl;
    cin.getline(buf, 100, '\n');
 
    send(s, buf, sizeof(buf), 0);
 
    if (recv(s, b, sizeof(b), 0) != 0) {
        b[strlen(b)] = '\0';
        cout << "Factorial m! + n! = " << b << endl;
    }
 
    closesocket(s);
 
 
 
 
    WSACleanup();
 
}
Когда ввожу свои значения, тупо выбивает ошибку. Убираю из сервера циклы for и оно работает, но выдаёт бред. Мне нужно передать значения factorial обратно клиенту, как это можно реализовать?

Добавлено через 23 минуты
Он почему-то посылает 0, вместо 144(факториал 4!+5!)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2022, 23:59
Ответы с готовыми решениями:

Не отправляет клиенту ответ
Добрый вечер, задача такая клиент пишет серверу слово, сервер ищет это слово в файле и отправляет...

Сервер отправляет пустую строку клиенту
Пытаюсь разработать функционал обновления с клиент-серверной архитектурой. Сначала клиент...

Прием сервером от клиента чисел, затем сервер умножает и отправляет результат клиенту
Здравствуйте! Помогите пожалуйста сделать клиент-серверное приложение. Клиент отправляет серверу...

Клиент отправляет сообщение сервеу, а сервер это отправляет всем клиентам...
Есть сервер и несколько клиентов. Клиент отправляет сообщение сервеу, а сервер это отправляет всем...

Не отправляет клиенту
Клиент пишет серверу слово, это слово ищется в файле на сервере, и передает номер строки где оно...

2
Любитель чаепитий
3744 / 1800 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
16.02.2022, 07:39 2
Цитата Сообщение от Geron23 Посмотреть сообщение
C++
1
2
int num_x = atoi(x);
int num_y = atoi(y);
массивы x, y не обнулены изначально, поэтому эта функция может вернуть что угодно.

Цитата Сообщение от Geron23 Посмотреть сообщение
Res[strlen(res)] = '\0';
это не нужно, strcpy делает это самостоятельно.

Цитата Сообщение от Geron23 Посмотреть сообщение
send(s2, Res, sizeof(Res) - 2, 0);
во-первых, почему у вас везде посылается размер sizeof? это как минимум расточительно.
во-вторых, тут sizeof(Res) будет равен размеру указателя, а не кол-ву байт, выделенных под него.
Распространенные ошибки
в-третьих, вы выделили память для Res, но не освободили её.

плюс непонятно, какие данные вы вводите в программу вообще.

Цитата Сообщение от Geron23 Посмотреть сообщение
if (b[i] == NULL)
проверка неверная, сравнивать нужно с '\0'.
0
0 / 0 / 0
Регистрация: 20.02.2020
Сообщений: 56
16.02.2022, 09:35  [ТС] 3
Я ввожу значения в клиенте 4,5 они посылаются на сервер для расчёта, через отладку всё проверил и значения отправляемого res равна 144, но на клиенте оно почему-то равно 0

Добавлено через 15 минут
Всё, я решил проблему.
Ошибка была в этом
C++
1
b[strlen(b)] = '\0';
в клиенте это строка обнуляла получаемое значение
0
16.02.2022, 09:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.02.2022, 09:35
Помогаю со студенческими работами здесь

Клиент отправляет на сервер два целых числа (Диапазон). Сервер возвращает список простых чисел в этом диапазоне
Задача. Клиент отправляет на сервер два целых числа – границы диапазона. Сервер возвращает список...

Клиент должен отправить файл на сервер. Сервер его обработать и отправить клиенту текст
Ребят подскажите как сделать: Клиент должен отправить файл на сервер. Сервер его обработать и...

Iis сначала выполняет весь код вытаскивает все из базы а потом готовый хтмл (все вместе) уже отправляет клиенту ?
как это все работает!!! есть у меня хтмл и код асп например &lt;html&gt; Hello! &lt;%do until...

Сервер клиенту
Доброго времени суток. Пишу программу для ведения выдачи номеров. Хранятся данные в базе access,...

Сервер клиенту
как отправить сообщение от сервера к клиенту??? используется TIdUDpServe


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

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