С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
1 / 1 / 0
Регистрация: 28.05.2017
Сообщений: 17

Udp-чат

01.04.2019, 00:47. Показов 4007. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток! Недавно я начал изучать с++, и у меня возникла такая проблема: мне надо написать чат, где сообщения передаются с помощью UDp протокола с одного компьютера на другой в локальной сети. В интернете полно примеров реализации данной технологии, но проблема в том, что все они сделаны по типу "клиент-сервер", тогда как мне нужно сделать систему "клиент-клиент". Т.е., есть два компа, которые соединены в локальную сеть. На каждом из них запущена программа, причем программы абсолютно одинаковых. На каждом компе вбиваются норме порта для чтения, номер порта для прослушивания и ip адрес собеседника. После этого можно с одного компа на другой посылать текстовые сообщения. Может быть, кто то реализовывал что-то подобное, или хотя бы подскажет, где можно найти инфу об этом? Заранее спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.04.2019, 00:47
Ответы с готовыми решениями:

UDP чат без использования стандартных компонентов
Здраствуйте! Срочно нужен UDP чат но БЕЗ ИСПОЛЬЗОВАНИЯ стандартных компонентов... Кто может подсказать где можно найти, или какую нибуть...

UDP чат
Здравствуйте, с C++ знаком около недели, но нужно сделать сетевой чат по UDP. По разным мануалам сделал вот что. Код сервера. //...

Чат на C# с UDP
Доброго времени! Вобщем пишу для личных целей простенький чат, который состооит из сервара и клиента. Ошибка в них одна и та самая: цикл...

8
8 / 6 / 4
Регистрация: 31.03.2019
Сообщений: 41
01.04.2019, 07:46
Вам надо или вы все же этого только хотите
0
1 / 1 / 0
Регистрация: 28.05.2017
Сообщений: 17
01.04.2019, 08:22  [ТС]
Хочу) Вообще я этот чат уже писал, но с использованием c#, там все достаточно просто реализовывались, а вот как это в с++ сделать, разобраться не получается
0
 Аватар для igorrr37
2870 / 2017 / 991
Регистрация: 21.12.2010
Сообщений: 3,734
Записей в блоге: 8
02.04.2019, 20:50
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
#include <iostream>
#include <string>
#include <cstdlib>
#include <thread>
#include <boost/asio.hpp>
 
using boost::asio::ip::udp;
 
 
int main()
{
    system("chcp 1251");
    boost::asio::io_context ioc;
    std::string portListen, portSend, remIP;
    std::cout << "Порт послушки: ";
    std::getline(std::cin, portListen);
    std::cout << "\nПорт отправки: ";
    std::getline(std::cin, portSend);
    std::cout << "\nIP собеседника: ";
    std::getline(std::cin, remIP);
    udp::socket sct{ ioc, udp::endpoint{ udp::v4(), (unsigned short)std::stoul(portListen) }};
    udp::resolver rsl{ ioc };
    boost::system::error_code ec{};
    auto lep = rsl.resolve(udp::v4(), remIP, portSend, ec);
    if (ec)
    {
        std::cerr << "resolve: " << ec.value() << ' ' << ec.message() << std::endl;
    }
    std::thread tsend{ [&sct, &lep]() // поток отправки
    {
        boost::system::error_code ec{};
        std::string str;
        while (true)
        {
            std::getline(std::cin, str);
            if (str == "quit")
            {
                break;
            }
            auto sent = sct.send_to(boost::asio::buffer(str), *lep.begin(), 0, ec);
            if (ec)
            {
                std::cerr << "send_to: " << ec.value() << ' ' << ec.message() << std::endl;
            }
        }
    } };
    std::thread trecv{ [&sct]() // поток чтения
    {
        boost::system::error_code ec{};
        udp::endpoint ep;
        char buf[1024];
        while (true)
        {
            auto siz = sct.receive_from(boost::asio::buffer(buf, std::size(buf)), ep, 0, ec);
            if (ec)
            {
                std::cerr << "receive_from: " << ec.value() << ' ' << ec.message() << std::endl;
            }
            else
            {
                std::cout.write(buf, siz) << std::endl;
            }
        }
    } };
    trecv.detach();
    tsend.join();
    sct.shutdown(udp::socket::shutdown_both);
    sct.close();
 
}
0
0 / 0 / 0
Регистрация: 26.03.2019
Сообщений: 4
28.04.2020, 12:42
Вы бы не могли кинуть исходники на c#. У меня проблема как раз таки на C#. Буду очень признателен)

Добавлено через 1 минуту
kapablankaNew, Вы бы не могли кинуть исходники на c#. У меня проблема как раз таки на C#. Буду очень признателен)
0
1 / 1 / 0
Регистрация: 28.05.2017
Сообщений: 17
28.04.2020, 14:25  [ТС]
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Net;
using System.Net.Sockets;
 
namespace Udp_2
{
    class Program
    {
 
        static string remoteAddress; // хост для отправки данных
        static int remotePort; // порт для отправки данных
        static int localPort; // локальный порт для прослушивания входящих подключений
 
        static void Main(string[] args)
        {
            try
            {
                Console.Write("Enter the listening port: "); // локальный порт
                localPort = Int32.Parse(Console.ReadLine());
                Console.Write("Enter the remote address to connect: ");
                remoteAddress = Console.ReadLine(); // адрес, к которому мы подключаемся
                Console.Write("Enter the port to connect: ");
                remotePort = Int32.Parse(Console.ReadLine()); // порт, к которому мы подключаемся
 
                Thread receiveThread = new Thread(new ThreadStart(ReceiveMessage));
                receiveThread.Start();
                SendMessage(); // отправляем сообщение
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
        private static void SendMessage()
        {
            UdpClient sender = new UdpClient(); // создаем UdpClient для отправки сообщений
            try
            {
                while (true)
                {
                    string message = Console.ReadLine(); // сообщение для отправки
                    byte[] data = Encoding.Unicode.GetBytes(message);
                    sender.Send(data, data.Length, remoteAddress, remotePort); // отправка
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                sender.Close();
            }
        }
 
        private static void ReceiveMessage()
        {
            UdpClient receiver = new UdpClient(localPort); // UdpClient для получения данных
            IPEndPoint remoteIp = null; // адрес входящего подключения
            try
            {
                while (true)
                {
                    byte[] data = receiver.Receive(ref remoteIp); // получаем данные
                    string message = Encoding.Unicode.GetString(data);
                    Console.WriteLine("Interlocutor: {0}", message);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                receiver.Close();
            }
        }
    }
}
1
0 / 0 / 0
Регистрация: 26.03.2019
Сообщений: 4
28.04.2020, 17:23
kapablankaNew, Спасибо огромное. Не могли бы вы еще обьяснить как эти порты работают и как понять какой порт откуда брать и куда писать. Например: 1)Локальный порт - это порт, который можно узнать с помощью cmd: ipconfig -> netstat -a?
2) Порт который прослушивается - я не знаю где это брать.
У меня есть код чата:
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Windows.Forms;
using System.Threading.Tasks;
using System.Linq;
using System.Drawing;
using System.Data;
using System.ComponentModel;
using System.Collections.Generic;
 
namespace UdpChat
{
    public partial class Form1 : Form
    {
        bool alive = false; // будет ли работать поток для приема
        UdpClient client;
        const int LOCALPORT = 8001; // порт для приема сообщений
        const int REMOTEPORT = 8001; // порт для отправки сообщений
        const int TTL = 20;
        const string HOST = "235.255.255.0"; // хост для групповой рассылки
        IPAddress groupAddress; // адрес для групповой рассылки
 
        string userName; // имя пользователя в чате
        public Form1()
        {
            InitializeComponent();
 
            Button1.Enabled = true; // кнопка входа
            Button2.Enabled = false; // кнопка выхода
            Button3.Enabled = false; // кнопка отправки
            textBox3.ReadOnly = true; // поле для сообщений
 
            groupAddress = IPAddress.Parse(HOST);
        }
        // обработчик нажатия кнопки Вход
        private void Button1_Click(object sender, EventArgs e)
        {               
            userName = textBox1.Text;
            textBox1.ReadOnly = true;
 
            try
            {
                client = new UdpClient(LOCALPORT);
                // присоединяемся к групповой рассылке
                client.JoinMulticastGroup(groupAddress, TTL);
 
                // запускаем задачу на прием сообщений
                Task receiveTask = new Task(ReceiveMessages);
                receiveTask.Start();
 
                // отправляем первое сообщение о входе нового пользователя
                string message = userName + " вошел в чат";
                byte[] data = Encoding.Unicode.GetBytes(message);
                client.Send(data, data.Length, HOST, REMOTEPORT);
 
                Button1.Enabled = false;
                Button2.Enabled = true;
                Button3.Enabled = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        // метод приема сообщений
        private void ReceiveMessages()
        {
            alive = true;
            try
            {
                while (alive)
                {
                    IPEndPoint remoteIp = null;
                    byte[] data = client.Receive(ref remoteIp);
                    string message = Encoding.Unicode.GetString(data);
 
                    // добавляем полученное сообщение в текстовое поле
                    this.Invoke(new MethodInvoker(() =>
                    {
                        string time = DateTime.Now.ToShortTimeString();
                        textBox3.Text = time + " " + message + "\r\n" + textBox3.Text;
                    }));
                }
            }
            catch (ObjectDisposedException)
            {
                if (!alive)
                    return;
                throw;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        // обработчик нажатия кнопки Отправить
        private void Button3_Click(object sender, EventArgs e)
        {
            try
            {
                string message = String.Format("{0}: {1}", userName, textBox2.Text);
                byte[] data = Encoding.Unicode.GetBytes(message);
                client.Send(data, data.Length, HOST, REMOTEPORT);
                textBox2.Clear();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        // обработчик нажатия кнопки Выход
        private void Button2_Click(object sender, EventArgs e)
        {
            ExitChat();
        }
        // выход из чата
        private void ExitChat()
        {
            string message = userName + " покидает чат";
            byte[] data = Encoding.Unicode.GetBytes(message);
            client.Send(data, data.Length, HOST, REMOTEPORT);
            client.DropMulticastGroup(groupAddress);
 
            alive = false;
            client.Close();
 
            Button1.Enabled = true;
            Button2.Enabled = false;
            Button3.Enabled = false;
        }
        // обработчик события закрытия формы
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (alive)
                ExitChat();
        }
    }
}
Но при нажатии на кнопку вход ничего не происходит. Я думаю это связано как то с портами.
Спасибо заранее, что уделили время)
0
0 / 0 / 0
Регистрация: 26.03.2019
Сообщений: 4
28.04.2020, 17:29
Вот исходник есть
Вложения
Тип файла: zip UdpChat.zip (201.6 Кб, 45 просмотров)
0
1 / 1 / 0
Регистрация: 28.05.2017
Сообщений: 17
05.05.2020, 18:15  [ТС]
По поводу кнопки выход честно говоря не знаю, надо разбираться. Касаемо портов - в компах как правило 65536 TCP-UDP портов. Это своего рода адрес. В данном случае один порт используется для отправки сообщений, второй - для приема. Порты могут быть любыми, только желательно брать число 2000+, так как первые 1024 порта заняты системными процессами, плюс другие приложения также могут использовать порты ближе к началу. Соответственно, запускаете на двух компах программу, на первом вводите, например, порт прослушки 5001, порт отправки 5002, на втором компьютере соответственно наоборот. Теперь первый компьютер отправляет сообщение с порта 5002, а второй компьютер принимает сообщения через порт 5001, и наоборот.
В данном случае возможно связать только два компьютера, так как связь реализована как "клиент-клиент". Для создания полноценного чата надо пилить сервер.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.05.2020, 18:15
Помогаю со студенческими работами здесь

Чат на UDP
нашел чат, но он был на фин форме, я его начал переписывать на wpf, вроде все тоже самое написал, но работать не хочет!!! проблему...

UDP чат
ok ok ПривеТ! ВСЕМ я тут извелся на днях!!! КАК Сделат простенький UDP чАт на C++ Builder 6 !! PLZ! пацаны напешите код ести не...

Сетевой чат UDP
Пишу чат UDP, в процессе возникла ошибка, с которой не могу справиться. int main() { int sock; struct sockaddr_in...

Чат (UDP) Проблема с IP
Добры день! Пишу свой чат по протоколу UDP (Передаются только короткие текстовые сообщения). Так вот обнаружилась проблема. Дело в...

Не работает UDP чат
Всем привет. У меня возник вопрос. Посмотрел урок, сделал по нему чат-программу. Компилируется без ошибок и предупреждений, но не...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Новый 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