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

Клиент-серверное сетевое приложение через среду передачи данных стека TCP/IP

01.04.2014, 04:55. Показов 8467. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создать клиент/серверное сетевое приложение для обмена широковещательными текстовыми сообщениями через среду передачи данных стека TCP/IP.

Для реализации приложения необходимо использовать broadcast «датограмный» сокеты протокола UDP.



Технические требования.


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


Клиенту предоставляется возможность первому передать сообщение серверу.


Сервер, получив сообщение от клиента, должен предоставить возможность пользователю ответить на пришедшее от клиента сообщение.


Сервер и клиент после получения сообщения должен вывести его содержимое пользователю.


Вывод сообщения пользователю должен сопровождаться идентификатором компьютера, который его отправил (к примеру: IP-адресом, портом).
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.04.2014, 04:55
Ответы с готовыми решениями:

Создать клиент/серверное сетевое приложение для обмена текстовыми сообщениями
Создать клиент/серверное сетевое приложение для обмена текстовыми сообщениями через среду передачи данных стека TCP/IP. Для реализации...

Разработать консольное клиент серверное соединение TCP
Задание: Разработать TCP-сервер, создающий сокет, привязывающий его к локальному IP-адресу и порту и прослушивающий соединения клиентов....

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

25
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
01.04.2014, 11:00
studentstudents, советую вам обратиться во фриланс сразу.
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
01.04.2014, 12:37
Напишу просто так, но на бусте, устроит?

Добавлено через 22 секунды
Могу на епуле, но влень на чистых сокетах.
0
0 / 0 / 1
Регистрация: 01.04.2014
Сообщений: 22
01.04.2014, 13:03  [ТС]
эммм...а что такое буст??? (знаю, лох в этом деле )
ну в общем нужно просто чтоб работало
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
01.04.2014, 13:09
http://www.boost.org/

Это мне позволит не задумыватся о "типе" ОСи. Ускорит мою разработку до часа-двух.
0
0 / 0 / 1
Регистрация: 01.04.2014
Сообщений: 22
01.04.2014, 13:12  [ТС]
в общем мне абсолютно все равно!))) главное чтоб заработало нормально!))
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
01.04.2014, 13:14
Вам нужен бинарь или код? Если код, то чтобы собрать бинарь потребуется собрать буст.
0
0 / 0 / 1
Регистрация: 01.04.2014
Сообщений: 22
01.04.2014, 13:16  [ТС]
мне нужен код (желательно с комментариями. не сильно подробными но все же комментариями)
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
01.04.2014, 17:09
Возник один вопросик. по какому принципу должен происходить broadcast? При том что клиент шлет сообщение первый.
0
0 / 0 / 1
Регистрация: 01.04.2014
Сообщений: 22
02.04.2014, 08:54  [ТС]
я сегодня уточню и напишу!

Добавлено через 5 часов 25 минут
сегодня уточнить не удалось.. если еще актуально, спрошу завтра
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
02.04.2014, 12:30
Спорисите завтра, поспрашивайте поподробней.
0
0 / 0 / 1
Регистрация: 01.04.2014
Сообщений: 22
02.04.2014, 14:11  [ТС]
необходимо изменить клиентскую часть программы UDP клиент-сервера.

Нужно забить фиксированный адресс сервера: 255.255.255.255

И затем внести изменения в сокет (после его создания), что бы он стал широковещательным.

Для этого можно использовать команду setsockopt.
C++
1
2
3
4
5
6
7
int broadcast=1;
int sockfd = socket(PF_INET,SOCK_DGRAM,0))
if((setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof broadcast)) == -1)  
{  
 perror("setsockopt - SO_SOCKET ");  
 exit(1);  
}


P.S.

Формат у функции setsockopt:

int setsockopt (SOCKET s, int level, int optname, const char FAR * optval, int optlen);

"optval" - это указатель на значение опции "optname".

"optlen" - размер значения, т.к. он может быть переменным.

Так что облуляя optval, скорей всего отключишь применение этой опции.

Пробуйте изменить тип указателя переменной, используя пробразование в (char).

Хотя все должно работать и так.
0
0 / 0 / 1
Регистрация: 01.04.2014
Сообщений: 22
02.04.2014, 14:14  [ТС]
и вот программа о которй идет речь
Вложения
Тип файла: rar UDP_client_server.rar (983.5 Кб, 218 просмотров)
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
02.04.2014, 14:56
Вы не поняли. У Вас в задании есть пункт, клиент первый обращается к широковещательному серверу, что должен сделать сервер в данном случае, варианты ответа:
1. Ответить только клиенту.
2. Послать широковещательное сообщение всем.

Короче гооворя, если это broadcast сервер, то что он должен broadcast'ить
0
0 / 0 / 1
Регистрация: 01.04.2014
Сообщений: 22
03.04.2014, 08:04  [ТС]
ааа.. ну тогда только завтра уточню этот вопрос

Добавлено через 16 часов 59 минут
Все. Узнала. Вот тот код, что я скинула. В нем нужно модифицировать чтобы сообщение которое отправляется получали все. Ответ можно не делать вообще.
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
03.04.2014, 13:49
Если честно, Ваш ответ не прояснил нечего, но походу Вам нужен просто широковещательынй сервер.

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
#include <ctime>
#include <cstring>
#include <sstream>
#include <iostream>
 
#if defined(WIN32) || defined(WIN64) 
#include <windows.h>
#include <winsock2.h>
#else
#include <errno.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#endif
 
const int port = 4242;
 
static inline int last_error()
{
#if defined(WIN32) || defined(WIN64) 
    return WSAGetLastError();
#else
    return errno;
#endif
}
 
static std::string date_time()
{
    time_t now = time(NULL);
    struct tm *t = localtime(&now);
    
    std::stringstream ss;
    ss << (t->tm_year + 1900) << '-' 
    << (t->tm_mon + 1) << '-'
    << t->tm_mday;
 
    return ss.str();
}
 
int main(int, char*[])
{
 
#if defined(WIN32) || defined(WIN64) 
    WSADATA wsadata; 
    if (int errnum = WSAStartup(MAKEWORD(2, 2), &wsadata))
    {
        std::cout << "WSAStartup error: " << error << std::endl;
        return -1;
    }
#endif
 
    std::cout << "Date time UDP Broadcast server started" << std::endl;
 
    int sd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sd < 0)
    {
#if defined(WIN32) || defined(WIN64) 
        WSACleanup();
#endif
        std::cout << "Socket error: " << last_error() << std::endl;
        return -1;
    }
 
    int enable = 1;
    if (setsockopt(sd, SOL_SOCKET, SO_BROADCAST, &enable, sizeof(int)) != 0)    
    {
#if defined(WIN32) || defined(WIN64)
        closesocket(sd);
        WSACleanup();
#endif
        std::cout << "Setsockopt error: " << last_error() << std::endl;
        return -1;
    }
 
    struct sockaddr_in broadcast;
    memset(&broadcast, 0, sizeof(struct sockaddr_in));
    broadcast.sin_family      = AF_INET;
    broadcast.sin_addr.s_addr = INADDR_ANY;
    broadcast.sin_port        = htons(port);
    
    std::string buff = date_time();
    sendto(sd, &buff[0], buff.size(), 0, (struct sockaddr*)&broadcast, sizeof(struct sockaddr));
 
#if defined(WIN32) || defined(WIN64)
    closesocket(sd);
    WSACleanup();
#else
    close(sd);
#endif
 
    return 0;
}
п.с. Под виндой не билдил, но думаю проблем не будет.
0
0 / 0 / 1
Регистрация: 01.04.2014
Сообщений: 22
03.04.2014, 13:58  [ТС]
проблемы есть. оооочень много ругается
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
03.04.2014, 16:49
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 <ctime>
#include <cstring>
#include <sstream>
#include <iostream>
 
#if defined(WIN32) || defined(WIN64) 
#pragma comment(lib, "Ws2_32.lib")
 
#include <windows.h>
#include <winsock2.h>
#else
#include <errno.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#endif
 
const int port = 4242;
 
static inline int last_error()
{
#if defined(WIN32) || defined(WIN64) 
    return WSAGetLastError();
#else
    return errno;
#endif
}
 
static std::string date_time()
{
    time_t now = time(NULL);
    struct tm *t = localtime(&now);
    
    std::stringstream ss;
    ss << (t->tm_year + 1900) << '-' 
    << (t->tm_mon + 1) << '-'
    << t->tm_mday;
 
    return ss.str();
}
 
int main(int, char*[])
{
 
#if defined(WIN32) || defined(WIN64) 
    WSADATA wsadata; 
    if (int errnum = WSAStartup(MAKEWORD(2, 2), &wsadata))
    {
        std::cout << "WSAStartup error: " << last_error() << std::endl;
        return -1;
    }
#endif
 
    std::cout << "Date time UDP Broadcast server started" << std::endl;
 
    int sd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sd < 0)
    {
#if defined(WIN32) || defined(WIN64) 
        WSACleanup();
#endif
        std::cout << "Socket error: " << last_error() << std::endl;
        return -1;
    }
 
    int enable = 1;
    if (setsockopt(sd, SOL_SOCKET, SO_BROADCAST, reinterpret_cast<char*>(&enable), sizeof(int)) != 0)   
    {
#if defined(WIN32) || defined(WIN64)
        closesocket(sd);
        WSACleanup();
#endif
        std::cout << "Setsockopt error: " << last_error() << std::endl;
        return -1;
    }
 
    struct sockaddr_in broadcast;
    memset(&broadcast, 0, sizeof(struct sockaddr_in));
    broadcast.sin_family      = AF_INET;
    broadcast.sin_addr.s_addr = INADDR_ANY;
    broadcast.sin_port        = htons(port);
    
    std::string buff = date_time();
    sendto(sd, &buff[0], buff.size(), 0, (struct sockaddr*)&broadcast, sizeof(struct sockaddr));
 
#if defined(WIN32) || defined(WIN64)
    closesocket(sd);
    WSACleanup();
#else
    close(sd);
#endif
 
    return 0;
}
Поробуйте это, и если будет ругатся ошибки в студию
1
0 / 0 / 1
Регистрация: 01.04.2014
Сообщений: 22
04.04.2014, 04:57  [ТС]
вот ошибки
Миниатюры
Клиент-серверное сетевое приложение через среду передачи данных стека TCP/IP  
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
04.04.2014, 08:44
stima, MinGW?

studentstudents, попробуйте изменить подключение вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//#include <ctime>
#include <time.h>
#include <cstring>
#include <sstream>
#include <iostream>
 
#if defined(_WIN32) || defined(_WIN64)
//#include <windows.h>
#include <winsock2.h>
#else
#include <errno.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#endif
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.04.2014, 08:44
Помогаю со студенческими работами здесь

Клиент-серверное приложение
Использую простой найденный сервер. Там есть строка принимающая данные: bytes_read = recv(*it, buf, 8, 0); ..клиент, соответственно...

клиент-серверное приложение
Привет всем) Помогите пожалуйста... мне интересны клиент-серверные приложения... у меня есть несколько вопросов: 1) можно ли ето в dev...

Клиент-серверное приложение
Пишу упрощенный чатик. Возникла проблема с клиентской частью приложения. Я создал отдельный поток для обработки сообщений от...

Клиент-серверное приложение на C++
Здравствуйте. Хочу заняться разработкой клиент-серверного приложения на C++. Язык я знаю на достаточном уровне, но в сетевых приложениях ни...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru