С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
3 / 3 / 3
Регистрация: 17.10.2012
Сообщений: 147
1

Работа с сокетами Беркли: Нужно, чтобы сервер выдавал степень числа

09.09.2014, 12:13. Показов 3024. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем! Кто может помочь (объяснить) с написанием кода по сокетам беркли?
Мне нужно, чтобы сервер выдавал степень числа. Не нужно при этом использовать сторонние библиотеки.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.09.2014, 12:13
Ответы с готовыми решениями:

Работа с Сокетами Беркли
Вопрос можно создать сервер http, к которому обращаться по адресу в браузере и получать html...

Табулирование функции - Нужно, чтобы X выдавал наименьшее значения
Program omega5; uses crt; var x, y, A, B, E ,miny,minx: Real; function Arc (x : real) : real;...

Как сделать чтобы rand() выдавал в массив неповторяющиеся числа?
Короче смысл такой. Программка почти дописана, задача стояла такая: Написать метод /функцию,...

Работа с сокетами - скачать на сервер информацию от клиента
взаимодействие сервера и клиента работает на ура :) вопрос возник когда я захотел сделать...

11
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
09.09.2014, 15:44 2
Цитата Сообщение от Andrea13 Посмотреть сообщение
написанием кода по сокетам беркли?
а вчем у Вас проблема? вроде как тема заезженная, примеров хватает
0
3 / 3 / 3
Регистрация: 17.10.2012
Сообщений: 147
09.09.2014, 16:27  [ТС] 3
Не могли бы привести пример программы, которая бы просто выводила на экран цифру "1"?
Хочу посмотреть на структуру кода языка с++.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
09.09.2014, 16:45 4
C++
1
2
3
4
5
6
7
#include <iostream>
int main(int argc, char* argv[])
{
std::cout<<"1\n";
system("pause");
return 0;
}
0
3 / 3 / 3
Регистрация: 17.10.2012
Сообщений: 147
09.09.2014, 16:53  [ТС] 5
Я имел ввиду, чтобы это было реализовано через сокеты Беркли (клиент/сервер).
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
09.09.2014, 17:10 6
Andrea13, вот здесь есть и объяснение и примеры.
0
3 / 3 / 3
Регистрация: 17.10.2012
Сообщений: 147
09.09.2014, 17:12  [ТС] 7
Я уже смотрел туда - ничего дельного нету, т.е. не работает. У меня ошибками он закидывает библиотеки типа: #include <sys/types.h>
#include <sys/socket.h>
Мне сказали там код под юникс, а надо под винду писать.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
09.09.2014, 18:10 8
Цитата Сообщение от Andrea13 Посмотреть сообщение
Мне сказали там код под юникс, а надо под винду писать
А под виндой нет сокетов Беркли
Под виндой - winsock. Они похожи, но все-таки не одно и то же.
Вот статья, примеры там для Linux, но в конце есть небольшой раздельчик, где написано как заставить их работать в windows. Воспользоваться им также можно и чтобы перевести примеры из википедии под win.

Добавлено через 4 минуты
Andrea13, вот еще небольшое пошаговое руководство.
0
3 / 3 / 3
Регистрация: 17.10.2012
Сообщений: 147
09.09.2014, 21:37  [ТС] 9
Вот что у меня получилось (исходя из задания: мне нужно, чтобы сервер выдавал степень числа.)
Кликните здесь для просмотра всего текста

Сервер:
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 "stdafx.h"
#pragma comment(lib, "WS2_32.lib")
#pragma warning (disable:4496)
#include <stdio.h>
#include <winsock2.h> // Wincosk2.h должен быть раньше windows!
#include <windows.h>
#include <cmath>
 
 
#define MY_PORT 666 // Порт, который слушает сервер 666
 
 
 
 
int main(int argc, char* argv[])
{
    char buff[1024]; // Буфер для различных нужд
 
    printf("STARTING TCP SERVER\n");
    // Шаг 1 - Инициализация Библиотеки Сокетов
    // т.к. возвращенная функцией информация не используется
    // ей передается указатель на рабочий буфер, преобразуемый к указателю
    // на структуру WSADATA.
    // Такой прием позволяет сэкономить одну переменную, однако, буфер
    // должен быть не менее полкилобайта размером (структура WSADATA
    // занимает 400 байт)
    if (WSAStartup(0x0202, (WSADATA *)&buff[0]))
    {
        // Ошибка!
        printf("Error WSAStartup %d\n", WSAGetLastError());
        return -1;
    }
    SOCKET mysocket;//  создание сокета
    // AF_INET - сокет Интернета
    // SOCK_STREAM - потоковый сокет (с установкой соединения)
    // 0 - по умолчанию выбирается TCP протокол
 
    if ((mysocket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        // Ошибка!
        printf("Error socket %d\n", WSAGetLastError());
        WSACleanup(); // Деиницилизация библиотеки Winsock
        return -1;
    }
 
    // Шаг 3 - связывание сокета с адресом
    sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(MY_PORT); // порт сервера в сетевом порядке
    addr.sin_addr.s_addr = 0; // сервер принимает подключения
                                    // на все свои IP-адреса
 
    // вызываем bind для связывания
    if (bind(mysocket, (sockaddr *)&addr, sizeof(addr)))
    {
        // Ошибка
        printf("Error bind %d\n", WSAGetLastError());
        closesocket(mysocket); // закрываем сокет!
        WSACleanup();
        return -1;
    }
 
    // Шаг 4 - ожидание подключений
    // размер очереди - 10
    if (listen(mysocket, 10))
    {
        // Ошибка
        printf("Error listen %d\n", WSAGetLastError());
        closesocket(mysocket);
        WSACleanup();
        return -1;
    }
 
    printf("Waiting for connection...\n");
 
    // Шаг 5 - извлекаем сообщение из очереди
    SOCKET client_socket; // сокет для клиента
    sockaddr_in client_addr; // адрес клиента (заполняется системой)
 
    // функции accept необходимо передать размер структуры
    int client_addr_size = sizeof(client_addr);
 
    // цикл извлечения запросов на подключение из очереди
    while ((client_socket = accept(mysocket, (sockaddr *)&client_addr, &client_addr_size)))
    {
        printf("Connected Client\n");
        double a, c;
        int b=3;
        char *data = new char[100];
        while(true)
        {
            int check = recv(client_socket, data,100, 0);
            if(!strcmp(data, "EXIT") || check == SOCKET_ERROR)
            {
                printf("Waiting for connection...\n");
                break;
            }
            printf("received %s\n",data);
            a = atof(data);
            recv(client_socket, data,100, 0);
            if(!strcmp(data, "EXIT") || check == SOCKET_ERROR)
            {
                printf("Waiting for connection...\n");
                break;
            }
            printf("received %s\n",data);
            c = pow(a, b);
            printf(data, "Result is %lf\n", c);
            send(client_socket, data, 100, 0);
        }
    }
    closesocket(client_socket);
    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
#include "stdafx.h"
#pragma comment(lib, "WS2_32.lib")
#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>
 
#define PORT 666
#define SERVERADDR "127.0.0.1" 
 
int main(int argc, char* argv[])
{
    char buff[100];
    printf("TCP DEMO CLIENT\n");
 
    // Шаг 1 - инициализация библиотеки Winsock
    if (WSAStartup(0x202, (WSADATA *)&buff[0]))
    {
        printf("WSAStart error %d\n", WSAGetLastError());
        return -1;
    }
 
    // Шаг 2 - создание сокета
    SOCKET my_sock;
    my_sock = socket(AF_INET, SOCK_STREAM, 0);
    if (my_sock < 0)
    {
        printf("Socket() error %d\n", WSAGetLastError());
        return -1;
    }
 
    // Шаг 3 - установка соединения
    // заполнение структуры sockaddr_in - указание адреса и порта сервера
    sockaddr_in dest_addr;
    dest_addr.sin_family = AF_INET;
    dest_addr.sin_port = htons(PORT);
 
    // преобразование IP адреса из символьного в сетевой формат
    if (inet_addr(SERVERADDR) != INADDR_NONE)
        dest_addr.sin_addr.s_addr = inet_addr(SERVERADDR);
        else
        {
            printf("Invalid address %s\n", SERVERADDR);
            closesocket(my_sock);
            WSACleanup();
            return -1;
        }
    
 
    // адрес сервера получен - пытаемся установить соединение
    if (connect(my_sock, (sockaddr *)&dest_addr, sizeof(dest_addr)))
    {
        printf("Connect error %d\n", WSAGetLastError());
        return -1;
    }
    while(true)
    {
        printf("Connected to port %d, type 0 for exit\n", PORT);
        double tmp;
        printf("Enter first cathet: ");
        scanf_s("%lf", &tmp);
 
        printf(buff, "%lf",tmp);
        send(my_sock, buff, sizeof(buff), 0);
        recv(my_sock, buff, sizeof(buff), 0);
        //printf("%s\n", buff);
    }
    closesocket(my_sock);
    WSACleanup();
    return -1;
}

Суть в чем: Хочу, чтобы пользователь вводил число, к примеру "5" и оно возводилось в степень "3" (в сервере b=3). Не могу понять, почему не работает. Подскажите, где не правильно и, что там должно быть.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
09.09.2014, 22:20 10
Лучший ответ Сообщение было отмечено Andrea13 как решение

Решение

Цитата Сообщение от Andrea13 Посмотреть сообщение
printf(buff, "%lf",tmp);
sprintf, не printf. Но вообще можно ведь сразу посылать числа, не обязательно в строку их превращать.

Добавлено через 11 минут
Andrea13, вот переделал твои примеры:
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
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
#define PORT 666
#define SERVERADDR "127.0.0.1"
 
int main(int argc, char* argv[])
{
    printf("TCP DEMO CLIENT\n");
 
    WSADATA WsaData;
    // Шаг 1 - инициализация библиотеки Winsock
    if(WSAStartup(0x202, &WsaData))
    {
        printf("WSAStart error %d\n", WSAGetLastError());
        return -1;
    }
 
    // Шаг 2 - создание сокета
    SOCKET my_sock;
    my_sock = socket(AF_INET, SOCK_STREAM, 0);
    if(my_sock < 0)
    {
        printf("Socket() error %d\n", WSAGetLastError());
        return -1;
    }
 
    // Шаг 3 - установка соединения
    // заполнение структуры sockaddr_in - указание адреса и порта сервера
    sockaddr_in dest_addr;
    dest_addr.sin_family = AF_INET;
    dest_addr.sin_port = htons(PORT);
 
    // преобразование IP адреса из символьного в сетевой формат
    if(inet_addr(SERVERADDR) != INADDR_NONE)
        dest_addr.sin_addr.s_addr = inet_addr(SERVERADDR);
    else
    {
        printf("Invalid address %s\n", SERVERADDR);
        closesocket(my_sock);
        WSACleanup();
        return -1;
    }
 
    // адрес сервера получен - пытаемся установить соединение
    if(connect(my_sock, (sockaddr *)&dest_addr, sizeof(dest_addr)))
    {
        printf("Connect error %d\n", WSAGetLastError());
 
        closesocket(my_sock);
        WSACleanup();
        return -1;
    }
 
    printf("Connected to port %d, type 0 for exit\n", PORT);
    int value;
    printf("Enter value: ");
    scanf_s("%d", &value);
 
    value = htonl(value);
    send(my_sock, (char*)&value, sizeof(value), 0);
 
    int result;
    recv(my_sock, (char*)&result, sizeof(result), 0);
    result = ntohl(result);
    printf("Computed value [%d]\n", result);
 
    closesocket(my_sock);
    WSACleanup();
    return 0;
}


server
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
#define MY_PORT 666 // Порт, который слушает сервер 666
 
int main(int argc, char* argv[])
{
    printf("STARTING TCP SERVER\n");
    WSADATA WsaData;
 
    if(WSAStartup(0x0202, &WsaData))
    {
        // Ошибка!
        printf("Error WSAStartup %d\n", WSAGetLastError());
        return -1;
    }
    SOCKET mysocket;//  создание сокета
    // AF_INET - сокет Интернета
    // SOCK_STREAM - потоковый сокет (с установкой соединения)
    // 0 - по умолчанию выбирается TCP протокол
 
    if((mysocket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        // Ошибка!
        printf("Error socket %d\n", WSAGetLastError());
        WSACleanup(); // Деиницилизация библиотеки Winsock
        return -1;
    }
 
    // Шаг 3 - связывание сокета с адресом
    sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(MY_PORT); // порт сервера в сетевом порядке
    addr.sin_addr.s_addr = 0; // сервер принимает подключения
                                    // на все свои IP-адреса
 
    // вызываем bind для связывания
    if(bind(mysocket, (sockaddr *)&addr, sizeof(addr)))
    {
        // Ошибка
        printf("Error bind %d\n", WSAGetLastError());
        closesocket(mysocket); // закрываем сокет!
        WSACleanup();
        return -1;
    }
 
    // Шаг 4 - ожидание подключений
    // размер очереди - 10
    if(listen(mysocket, 10))
    {
        // Ошибка
        printf("Error listen %d\n", WSAGetLastError());
        closesocket(mysocket);
        WSACleanup();
        return -1;
    }
 
    printf("Waiting for connection...\n");
 
    // Шаг 5 - извлекаем сообщение из очереди
    SOCKET client_socket;    // сокет для клиента
    sockaddr_in client_addr; // адрес клиента (заполняется системой)
 
    // функции accept необходимо передать размер структуры
    int client_addr_size = sizeof(client_addr);
 
    // цикл извлечения запросов на подключение из очереди
    client_socket = accept(mysocket, (sockaddr *)&client_addr, &client_addr_size);
    if(client_socket < 0)
    {
        printf("Error on accept [%d]\n", WSAGetLastError());
        closesocket(mysocket);
        WSACleanup();
        return -1;
    }
    int value;
    int r = recv(client_socket, (char*)&value, sizeof(value), 0);
    if(r == sizeof(value))
    {
        value = ntohl(value);
        printf("Received value [%d]\n", value);
 
        int b = 3;
        int result = htonl((int)pow(value, b));
 
        send(client_socket, (char*)&result, sizeof(result), 0);
    }
    closesocket(client_socket);
    closesocket(mysocket);
    WSACleanup();
 
    return 0;
}


Добавлено через 3 минуты
Такой прием позволяет сэкономить одну переменную, однако, буфер должен быть не менее полкилобайта размером
Кто только пишет такое. Мда.
1
3 / 3 / 3
Регистрация: 17.10.2012
Сообщений: 147
09.09.2014, 22:35  [ТС] 11
Последний (ваш) вариант ничего не выдает. Завершается, если нажать "Enter".
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
09.09.2014, 22:57 12
Цитата Сообщение от Andrea13 Посмотреть сообщение
Последний (ваш) вариант ничего не выдает. Завершается, если нажать "Enter".
Естественно он завершается
Можно запустить программу из cmd или добавить в конец system("pause"), чтобы увидеть результат.
0
09.09.2014, 22:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.09.2014, 22:57
Помогаю со студенческими работами здесь

Работа с сокетами: клиент и сервер в одной программе
Подскажите как лучше реализовать. Есть программа №1 она посылает данные другой программе через...

Работа с сокетами: клиент-сервер работает только из под отладки
Пытаюсь осилить сетевое программирование, отойдя чуть дальше простых примеров. В отладчике работает...

Написать процедуру, чтобы можно было вводить числа с клавиатуры и вывод выдавал с помощью Enter
нужно помочь написать процедуру,чтобы можно было вводить числа с клавиатуры и вывод выдавал с...


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

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