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

Передача данных клиент-сервер

24.12.2015, 07:04. Показов 2637. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, пытаюсь разобраться с передачей данных клиент-сервер. Вот кое-как по примерам в интернете написал, что нужно, но выдает две ошибки. Подскажите пожалуйста, как исправить.
КЛИЕНТ
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
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
 
#define MY_PORT 666
 
// макрос для печати количества активных пользователей
#define PRINTNUSERS if (nclients) printf("%d user on-line\n", nclients); \
                else printf("No User on line\n");
 
// прототип функции, обслуживающий подключившихся пользователей
DWORD WINAPI SexToClient(LPVOID client_socket);
 
 
 
 
// глобальная переменная - количество активных пользователей
int nclients = 0;
 
int main(int argc, char* argv[])
{
    char buff[1024]; // Буфер для различных нужд
 
    printf("TCP SERVER DEMO\n");
    if (WSAStartup(0x0202, (WSADATA *)&buff[0]))
    {
        // Ошибка!
        printf("Error WSAStartup %d\n", WSAGetLastError());
        return -1;
    }
 
    SOCKET mysocket;
    if ((mysocket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        // Ошибка!
        printf("Error socket %d\n", WSAGetLastError());
        WSACleanup(); // Деиницилизация библиотеки Winsock
        return -1;
    }
 
    sockaddr_in local_addr;
    local_addr.sin_family = AF_INET;
    local_addr.sin_port = htons(MY_PORT);
    local_addr.sin_addr.s_addr = 0; // сервер принимает подключения
 
    // вызываем bind для связывания
    if (bind(mysocket, (sockaddr *)&local_addr, sizeof(local_addr)))
    {
        // Ошибка
        printf("Error bind %d\n", WSAGetLastError());
        closesocket(mysocket); // закрываем сокет!
        WSACleanup();
        return -1;
    }
 
    // размер очереди - 0x100
    if (listen(mysocket, 0x100))
    {
        // Ошибка
        printf("Error listen %d\n", WSAGetLastError());
        closesocket(mysocket);
        WSACleanup();
        return -1;
    }
 
    printf("ozidanie podkluceniy...\n");
 
    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)))
    {
        nclients++;
 
        // пытаемся получить имя хоста
        HOSTENT *hst;
        hst = gethostbyaddr((char *)&client_addr.sin_addr.s_addr, 4, AF_INET);
 
        // вывод сведений о клиенте
        printf("+%s [%s] new connect!\n",
            (hst) ? hst->h_name : "", inet_ntoa(client_addr.sin_addr));
        PRINTNUSERS
 
            DWORD thID;
        CreateThread(NULL, NULL, SexToClient, &client_socket, NULL, &thID);
    }
    return 0;
}
 
DWORD WINAPI SexToClient(LPVOID client_socket)
{
    SOCKET my_sock;
    my_sock = ((SOCKET *)client_socket)[0];
    char buff[20 * 1024];
#define sHELLO "SOCKET PODKLUCHEN\r\n"
 
    // отправляем клиенту приветствие
    send(my_sock, sHELLO, sizeof(sHELLO), 0);
 
    // цикл эхо-сервера: прием строки от клиента и возвращение ее клиенту
    int bytes_recv;
    while ((bytes_recv = recv(my_sock, &buff[0], sizeof(buff), 0)) &&
        bytes_recv != SOCKET_ERROR)
        send(my_sock, &buff[0], bytes_recv, 0);
    nclients--; // уменьшаем счетчик активных клиентов
    printf("-disconnect\n"); PRINTNUSERS
 
        closesocket(my_sock);
    return 0;
}
Ошибка 1 error C4996: 'gethostbyaddr': Use getnameinfo() or GetNameInfoW() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings

Сервер
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
#pragma comment(lib, "ws2_32.lib")
#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>
 
#define PORT 666
#define SERVERADDR "*.*.*.*" //Звёздочками пометил свой IP
 
int main(int argc, char* argv[])
{
    char buff[1024];
    printf("TCP DEMO CLIENT\n");
 
    if (WSAStartup(0x202, (WSADATA *)&buff[0]))
    {
        printf("WSAStart error %d\n", WSAGetLastError());
        return -1;
    }
 
    SOCKET my_sock;
    my_sock = socket(AF_INET, SOCK_STREAM, 0);
    if (my_sock < 0)
    {
        printf("Socket() error %d\n", WSAGetLastError());
        return -1;
    }
 
    // заполнение структуры sockaddr_in - указание адреса и порта сервера
    sockaddr_in dest_addr;
    dest_addr.sin_family = AF_INET;
    dest_addr.sin_port = htons(PORT);
    HOSTENT *hst;
 
    // преобразование IP адреса из символьного в сетевой формат
    if (inet_addr(SERVERADDR) != INADDR_NONE)
        dest_addr.sin_addr.s_addr = inet_addr(SERVERADDR);
    else
    {
        // попытка получить IP адрес по доменному имени сервера
        if (hst = gethostbyname(SERVERADDR))
            ((unsigned long *)&dest_addr.sin_addr)[0] =
            ((unsigned long **)hst->h_addr_list)[0][0];
        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;
    }
 
    printf("Soedinenie s %s uspeshno ustanovlenno\n \
                       Type quit for quit\n\n", SERVERADDR);
 
    int nsize;
    while ((nsize = recv(my_sock, &buff[0], sizeof(buff) - 1, 0)) != SOCKET_ERROR)
    {
        buff[nsize] = 0;
 
        printf("S=>C:%s", buff);
 
        printf("S<=C:"); fgets(&buff[0], sizeof(buff) - 1, stdin);
 
        if (!strcmp(&buff[0], "quit\n"))
        {
            printf("Exit...");
            closesocket(my_sock);
            WSACleanup();
            return 0;
        }
 
        send(my_sock, &buff[0], strlen(&buff[0]), 0);
    }
    printf("Recv error %d\n", WSAGetLastError());
    closesocket(my_sock);
    WSACleanup();
    return -1;
}
Ошибка 1 error C4996: 'inet_addr': Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.12.2015, 07:04
Ответы с готовыми решениями:

Передача данных Клиент-сервер-клиенты
Как передавать не строчные значения, а к примеру координаты float, целочисленные и логику? //...

Клиент-Сервер: передача байтов
Здравствуйте! Написала приложения клиента и сервера. Может, кто подскажет, как сделать буфер...

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

Передача и получение клиент-сервер
У меня программа- консольное приложение с архитектурой клиент-сервер. Также сервер подключен к базе...

4
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
24.12.2015, 07:38 2
Обе ошибки говорят как исправить проблему. Пробовал?
0
3 / 3 / 3
Регистрация: 03.11.2014
Сообщений: 80
24.12.2015, 09:41  [ТС] 3
Ошибка исправлена)
появился новый вопрос: клиент передает сообщение на сервер. Могу ли я как-то вывести это сообщение серверу в консоле? пытался самым очевидным образом, оно выводит сначала это сообщение на сервер, а потом кучу непонятных символов. Помогите это исправить.
C++
1
2
3
4
5
6
while ((bytes_recv = recv(my_sock, &buff[0], sizeof(buff), 0)) &&
        bytes_recv != SOCKET_ERROR)
    {
        send(my_sock, &buff[0], bytes_recv, 0);
        printf(&buff[0]);
    }
Добавлено через 36 минут
а вообще, задача состоит в том, чтобы записать число, которое я передаю с клиента в какую-либо другую переменную, сравнить потом это числом с другим кое-каким числом и вывести клиенту и серверу результат. Вот это в общем и пытаюсь реализовать, буду рад помощи)

Добавлено через 44 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
    int weapon;
    char result[20 * 1024];
    while ((bytes_recv = recv(my_sock, &buff[0], sizeof(buff), 0)) &&
        bytes_recv != SOCKET_ERROR)
    {
        buff[bytes_recv] = 0;
        send(my_sock, &buff[0], bytes_recv, 0);
        strcat(result, buff);
        weapon = atoi(result);
        cout << weapon;
    }
Решил проблему с мусором, пытаюсь теперь просто переделать в число. Выдает все время 0.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
24.12.2015, 09:50 4
Цитата Сообщение от Avgust Посмотреть сообщение
а потом кучу непонятных символов. Помогите это исправить.
C++
1
2
3
send(my_sock, &buff[0], bytes_recv, 0);
buff[bytes_recv] = 0; // <-- вот это добавь
printf(&buff[0]);
Добавлено через 1 минуту
result обнули перед использованием, но он вообще кажется лишним
1
0 / 0 / 0
Регистрация: 09.09.2015
Сообщений: 1
27.10.2016, 09:12 5
Ошибка 1 error C4996: 'gethostbyaddr': Use getnameinfo() or GetNameInfoW() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings

Ошибка 1 error C4996: 'inet_addr': Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings
Ну решили проблему, выставьте рабочий код, покажите другим новичкам.

спасибо!
0
27.10.2016, 09:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.10.2016, 09:12
Помогаю со студенческими работами здесь

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

Tcp ip клиент-сервер C++ сервер выводит мусор
server # include &lt;sys/types.h&gt; # include &lt;iostream&gt; # include &lt;winsock2.h&gt; # include...

Клиент/сервер: клиент посылает серверу слово; определить, является ли это слово палиндромом
Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Функционирование клиента и...

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


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

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