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

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

01.04.2014, 04:55. Показов 8338. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru