1 / 1 / 0
Регистрация: 28.05.2017
Сообщений: 17
1

Udp-чат

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

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток! Недавно я начал изучать с++, и у меня возникла такая проблема: мне надо написать чат, где сообщения передаются с помощью UDp протокола с одного компьютера на другой в локальной сети. В интернете полно примеров реализации данной технологии, но проблема в том, что все они сделаны по типу "клиент-сервер", тогда как мне нужно сделать систему "клиент-клиент". Т.е., есть два компа, которые соединены в локальную сеть. На каждом из них запущена программа, причем программы абсолютно одинаковых. На каждом компе вбиваются норме порта для чтения, номер порта для прослушивания и ip адрес собеседника. После этого можно с одного компа на другой посылать текстовые сообщения. Может быть, кто то реализовывал что-то подобное, или хотя бы подскажет, где можно найти инфу об этом? Заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.04.2019, 00:47
Ответы с готовыми решениями:

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

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

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

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

8
8 / 6 / 4
Регистрация: 31.03.2019
Сообщений: 41
01.04.2019, 07:46 2
Вам надо или вы все же этого только хотите
0
1 / 1 / 0
Регистрация: 28.05.2017
Сообщений: 17
01.04.2019, 08:22  [ТС] 3
Хочу) Вообще я этот чат уже писал, но с использованием c#, там все достаточно просто реализовывались, а вот как это в с++ сделать, разобраться не получается
0
2855 / 2002 / 988
Регистрация: 21.12.2010
Сообщений: 3,707
Записей в блоге: 10
02.04.2019, 20:50 4
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 5
Вы бы не могли кинуть исходники на c#. У меня проблема как раз таки на C#. Буду очень признателен)

Добавлено через 1 минуту
kapablankaNew, Вы бы не могли кинуть исходники на c#. У меня проблема как раз таки на C#. Буду очень признателен)
0
1 / 1 / 0
Регистрация: 28.05.2017
Сообщений: 17
28.04.2020, 14:25  [ТС] 6
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 7
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 8
Вот исходник есть
Вложения
Тип файла: zip UdpChat.zip (201.6 Кб, 45 просмотров)
0
1 / 1 / 0
Регистрация: 28.05.2017
Сообщений: 17
05.05.2020, 18:15  [ТС] 9
По поводу кнопки выход честно говоря не знаю, надо разбираться. Касаемо портов - в компах как правило 65536 TCP-UDP портов. Это своего рода адрес. В данном случае один порт используется для отправки сообщений, второй - для приема. Порты могут быть любыми, только желательно брать число 2000+, так как первые 1024 порта заняты системными процессами, плюс другие приложения также могут использовать порты ближе к началу. Соответственно, запускаете на двух компах программу, на первом вводите, например, порт прослушки 5001, порт отправки 5002, на втором компьютере соответственно наоборот. Теперь первый компьютер отправляет сообщение с порта 5002, а второй компьютер принимает сообщения через порт 5001, и наоборот.
В данном случае возможно связать только два компьютера, так как связь реализована как "клиент-клиент". Для создания полноценного чата надо пилить сервер.
0
05.05.2020, 18:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.05.2020, 18:15
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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