Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/26: Рейтинг темы: голосов - 26, средняя оценка - 4.88
1 / 1 / 2
Регистрация: 19.11.2009
Сообщений: 61

Передача сервер к выбраному клиенту (многопоточный)

08.01.2011, 02:06. Показов 4976. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Net;
 
namespace MPserver
{
    class Program
    {
        static void Main(string[] args)
        {
            
            int port = 9999;
            string cmd;
            serverMN smn = new serverMN(port);
            smn.Start();
            Console.WriteLine("Creating server...");
            while (true)
            {
                Console.WriteLine("Created. Type EXIT to close server");
                cmd = Console.ReadLine();   //Ждём фразы EXIT для выхода из приложения
                if (cmd == "EXIT")
                {
                    return;
                }
            }
        }
    }
 
    class serverMN
    {
        private Socket s;
        private int Port;
        public serverMN(int port)
        {
          
            Port = port;
        }
 
        private class ConnectionInfo
        {
            public Socket Socket;
            public Thread Thread;
        }
 
        private Thread Th;
        private List<ConnectionInfo> connect = new List<ConnectionInfo>();
 
        public void Start()
        {
            SetupServerSocket();
            Th = new Thread(AcceptConnections);
            
            Th.IsBackground = true;
            Th.Start();
        }
 
        private void SetupServerSocket()
        {
            // Получаем информацию о локальном компьютере
           // Console.WriteLine("IPAdres>>>"+IP);
            IPEndPoint myEndPort = new IPEndPoint(IPAddress.Any, Port);
            Console.WriteLine("myEndPort>>>" + myEndPort);
            // Создаем сокет, привязываем его к адресу
            s = new Socket(myEndPort.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            s.Bind(myEndPort);
            s.Listen((int)SocketOptionName.MaxConnections);
        }
        
        private void AcceptConnections()
        {
            while (true)
            {
                
                // Принимаем соединение
                Socket socket = s.Accept();
                ConnectionInfo connection = new ConnectionInfo();
                connection.Socket = socket;
                // Создаем поток для получения данных
                connection.Thread = new Thread(ProcessConnection);
                connection.Thread.IsBackground = true;
                connection.Thread.Start(connection);
                // Сохраняем сокет
                lock (connect) connect.Add(connection);
            }
        }
 
        private void ProcessConnection(object state)
        {
            ConnectionInfo connection = (ConnectionInfo)state;
            byte[] bufer = new byte[1024];
            string data;
            try
            {
                while (true)
                {
                    int i = connection.Socket.Receive(bufer);
                    if (i > 0)
                    {
                        data = Encoding.ASCII.GetString(bufer, 0, i).Trim();
                        connection.Socket.Send(Encoding.ASCII.GetBytes("Your data: " + data));
                        Console.WriteLine("<" + data);
                    }
                    else if (i == 0)
                        return;
                }
            }
            catch (SocketException exc)
            {
                Console.WriteLine("Socket exception: " + exc.SocketErrorCode);
            }
            catch (Exception exc)
            {
                Console.WriteLine("Exception: " + exc);
            }
            finally
            {
                connection.Socket.Close();
                lock (connect) connect.Remove(connection);
            }
        }
    }
}
как можно от
C#
1
 private List<ConnectionInfo> connect = new List<ConnectionInfo>();
взять счётчик чтоб патом при выборе клиента передать сообщение
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.01.2011, 02:06
Ответы с готовыми решениями:

многопоточный сервер TCP
Создал сервер TCP, но нужно его переделать на многопоточный, что-бы могло подключиться большое количество пользователей одновременно. Вот...

Многопоточный клиент-сервер
начал разбираться с сетями, и столкнулся с такой проблемой... когда 1 клиент и 1 сервер, то тут все понятно... а вот когда один ко многим...

Многопоточный TCP сервер
Доброго времени суток! Я уже долгое время пытаюсь написать сервер, который может принимать много соединений с многими клиентами...

20
20 / 20 / 2
Регистрация: 27.08.2009
Сообщений: 71
08.01.2011, 23:33
Я использовал для данной темы индификатор типо id(счетчик подключений(при конекте +1), или индивидуальный номер подключившегося(после подключения идентификация)) или имя...
Ну и поудобнее использовать список dictionary....
И не особо понял для чего Вы в ConnectionInfo сохраняете поток?

1) Dictionary<string, ConnectionInfo> connect = new dictionary<string, ConnectionInfo> ();
2) Или добавить в клас
C#
1
2
3
4
5
6
 private class ConnectionInfo
        {
            public Socket Socket;
            public Thread Thread;
            public string id;
        }
1
1 / 1 / 2
Регистрация: 19.11.2009
Сообщений: 61
10.01.2011, 00:10  [ТС]
ConnectionInfo уже существует пишет

Добавлено через 8 часов 48 минут
мдя вот я тупанул с просони посмотрел на прогу и не заметил ыыыы

Добавлено через 28 минут
вот я сделал так но возникло 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
using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Net;
 
namespace MPserver
{
    class Program
    {
        static void Main(string[] args)
        {
            
            int port = 9999;
            string cmd;
            serverMN smn = new serverMN(port);
            smn.Start();
            Console.WriteLine("Creating server...");
            while (true)
            {
                Console.WriteLine("Created. Type EXIT to close server");
                cmd = Console.ReadLine();   //Ждём фразы EXIT для выхода из приложения
                if (cmd == "EXIT")
                {
                    return;
                }
            }
        }
    
    }
 
    
    class serverMN
    {
        
        private Socket s;
        private int Port;
        public serverMN(int port)
        {
          
            Port = port;
        }
 
        private class ConnectionInfo
        {
            public Socket Socket;
            public Thread Thread;
            public int id;
 
        }
 
        private Thread Th;
       // private List<ConnectionInfo> connect = new List<ConnectionInfo>();
        Dictionary<int, ConnectionInfo> connect = new Dictionary<int, ConnectionInfo>();
        
        
        public void Start()
        {
            SetupServerSocket();
            Th = new Thread(AcceptConnections);
            Th.IsBackground = true;
            Th.Start();
        }
 
        private void SetupServerSocket()
        {
            // Получаем информацию о локальном компьютере
            //IPAddress IP = IPAddress.Parse("172.16.18.7");
           // Console.WriteLine("IPAdres>>>"+IP);
            IPEndPoint myEndPort = new IPEndPoint(IPAddress.Any, Port);
            Console.WriteLine("myEndPort>>>" + myEndPort);
            // Создаем сокет, привязываем его к адресу
            s = new Socket(myEndPort.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            s.Bind(myEndPort);
            s.Listen((int)SocketOptionName.MaxConnections);
        }
        
        private void AcceptConnections()
        {
            while (true)
            {
                
                // Принимаем соединение
                Socket socket = s.Accept();
                ConnectionInfo connection = new ConnectionInfo();
                connection.Socket = socket;
                int id = 0;
                // Создаем поток для получения данных
                connection.Thread = new Thread(ProcessConnection);
                connection.Thread.IsBackground = true;
                connection.Thread.Start(connection);
                // Сохраняем сокет
                lock (connect) connect.Add(id,connection);
            }
        }
 
        private void ProcessConnection(object state)
        {
 
            ConnectionInfo connection = (ConnectionInfo)state;
            byte[] k = new byte[1024];
            byte[] bufer = new byte[1024];
          
            string data;
            try
            {
                while (true)
                {
                    int q = connection.Socket.Receive(k);
                    int i = connection.Socket.Receive(bufer);
                    if (i > 0 && q > 0)
                    {
                        string e = Encoding.ASCII.GetString(k, 0, q).Trim();
                        data = Encoding.ASCII.GetString(bufer, 0, i).Trim();
                        connection.Socket.Send(Encoding.ASCII.GetBytes(e+" :  " + data));
                        Console.WriteLine(e +":  " + data);
                    }
                    else if (i == 0)
                        return;
                }
            }
            catch (SocketException exc)
            {
                Console.WriteLine("Socket exception: " + exc.SocketErrorCode);
            }
            catch (Exception exc)
            {
                Console.WriteLine("Exception: " + exc);
            }
            finally
            {
                connection.Socket.Close();
                lock (connect) connect.Remove(connection);
            }
        }
    }
    
}
1 ошибка Наиболее подходящий перегруженный метод для "System.Collections.Generic.Dictionary<i nt,MPserver.serverMN.ConnectionInfo>.Rem ove(int)" имеет несколько недопустимых аргументов
2 ошибка Аргумент "1": преобразование типа из "MPserver.serverMN.ConnectionInfo" в "int" невозможно
0
19 / 19 / 2
Регистрация: 11.12.2010
Сообщений: 56
10.01.2011, 00:27
по сути
так
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
 private void ProcessConnection(object state)
        {
 
            ConnectionInfo connection = (ConnectionInfo)state;
            byte[] k = new byte[1024];
            byte[] bufer = new byte[1024];
          
            string data;
            try
            {
                while (true)
                {
                    int q = connection.Socket.Receive(k);
                    int i = connection.Socket.Receive(bufer);
                    if (i > 0 && q > 0)
                    {
                        string e = Encoding.ASCII.GetString(k, 0, q).Trim();
                        data = Encoding.ASCII.GetString(bufer, 0, i).Trim();
                        connection.Socket.Send(Encoding.ASCII.GetBytes(e+" :  " + data));
                        Console.WriteLine(e +":  " + data);
                    }
                    else if (i == 0)
                        return;
                }
            }
            catch (SocketException exc)
            {
                Console.WriteLine("Socket exception: " + exc.SocketErrorCode);
            }
            catch (Exception exc)
            {
                Console.WriteLine("Exception: " + exc);
            }
            finally
            {
                connection.Socket.Close();
                lock (connect) connect.Remove(connection.id);
            }
        }

но я не тестил
 Комментарий модератора 
Тэги [B][/B] внутри тэга [CSHARP][/CSHARP] не работают чтоле?
Не работают.
1
1 / 1 / 2
Регистрация: 19.11.2009
Сообщений: 61
10.01.2011, 01:35  [ТС]
всё работает но как же выбрать № id для передачи топу клиенту
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
141
142
143
using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Net;
 
namespace MPserver
{
    class Program
    {
        static void Main(string[] args)
        {
            
            int port = 9999;
            string cmd;
            serverMN smn = new serverMN(port);
            smn.Start();
            Console.WriteLine("Creating server...");
            while (true)
            {
                Console.WriteLine("Created. Type EXIT to close server");
                cmd = Console.ReadLine();   //Ждём фразы EXIT для выхода из приложения
                if (cmd == "EXIT")
                {
                    return;
                }
            }
        }
    
    }
 
    
    class serverMN
    {
        public int id = 0;
        private Socket s;
        private int Port;
        public serverMN(int port)
        {
          
            Port = port;
        }
 
        private class ConnectionInfo
        {
            public Socket Socket;
            public Thread Thread;
            public int id;
 
        }
 
        private Thread Th;
       // private List<ConnectionInfo> connect = new List<ConnectionInfo>();
        Dictionary<int, ConnectionInfo> connect = new Dictionary<int, ConnectionInfo>();
        
        
        public void Start()
        {
            SetupServerSocket();
            Th = new Thread(AcceptConnections);
            Th.IsBackground = true;
            Th.Start();
        }
 
        private void SetupServerSocket()
        {
            // Получаем информацию о локальном компьютере
            //IPAddress IP = IPAddress.Parse("172.16.18.7");
           // Console.WriteLine("IPAdres>>>"+IP);
            IPEndPoint myEndPort = new IPEndPoint(IPAddress.Any, Port);
            Console.WriteLine("myEndPort>>>" + myEndPort);
            // Создаем сокет, привязываем его к адресу
            s = new Socket(myEndPort.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            s.Bind(myEndPort);
            s.Listen((int)SocketOptionName.MaxConnections);
        }
        
        private void AcceptConnections()
        {
            while (true)
            {
                
                // Принимаем соединение
                Socket socket = s.Accept();
                ConnectionInfo connection = new ConnectionInfo();
                connection.Socket = socket;
               
                // Создаем поток для получения данных
                connection.Thread = new Thread(ProcessConnection);
                
                connection.Thread.IsBackground = true;
                connection.Thread.Start(connection);
                // Сохраняем сокет
                lock (connect) connect.Add(id,connection);
                id = id + 1;
                Console.WriteLine("id>>>" + id);
                
            }
        }
 
        private void ProcessConnection(object state)
        {
 
            ConnectionInfo connection = (ConnectionInfo)state;
            byte[] k = new byte[1024];
            byte[] bufer = new byte[1024];
          
            string data;
            try
            {
                while (true)
                {
                    int q = connection.Socket.Receive(k);
                    int i = connection.Socket.Receive(bufer);
                    if (i > 0 && q > 0)
                    {
                        string e = Encoding.ASCII.GetString(k, 0, q).Trim();
                        data = Encoding.ASCII.GetString(bufer, 0, i).Trim();
                        connection.Socket.Send(Encoding.ASCII.GetBytes(e+" :  " + data));
                        Console.WriteLine(e +":  " + data);
                    }
                    else if (i == 0)
                        return;
                }
            }
            catch (SocketException exc)
            {
                Console.WriteLine("Socket exception: " + exc.SocketErrorCode);
            }
            catch (Exception exc)
            {
                Console.WriteLine("Exception: " + exc);
            }
            finally
            {
                connection.Socket.Close();
                lock (connect) connect.Remove(connection.id);
            }
        }
    }
    
}
0
19 / 19 / 2
Регистрация: 11.12.2010
Сообщений: 56
10.01.2011, 01:37
Я не пойму вообще смысла задачи. Можно подробное объяснение?
0
1 / 1 / 2
Регистрация: 19.11.2009
Сообщений: 61
10.01.2011, 01:50  [ТС]
нада создать видео чат
я создал клиент с чатом и web камерой (проблема с записью изображения в буфер)
мне нада через много поточный сервер передать клиенту(клиент вводит № друго)
сообщения с чата и видео с камеры
0
19 / 19 / 2
Регистрация: 11.12.2010
Сообщений: 56
10.01.2011, 02:02
Вон оно как..Скайп жешь есть. Ну да ладно, забудем про него %) Чат..то бишь одновременно несколько человек могут видеть тебя и соответственно ты их видишь всех?
Если так, то.
1. Передавать видео поток каждому - не рационально.
2. Показывать несколько человек одновременно - не удобно. пусть даже 10 человек - как ты их всех разместишь на форме?
1 - Надо думать в сторону некой буферизации чтоле.. на серверной стороне. Камера тебя снимает и отправляет серверу. Сервер буферизует в файл-поток и по запросу выдает данные из него. а уж все желающие лицезреть тебя запрашивают у сервера этот поток.
как-то так. но сильно накручено. ты вообще обдумывал такие детали?
0
1 / 1 / 2
Регистрация: 19.11.2009
Сообщений: 61
10.01.2011, 02:05  [ТС]
всё проще
клиент оправляет серверу № другого клиента и у тому клиенту передаётся видео с камеры
и 1 клиент может 2му писать
если 2ой хочет соеденится то он отправляет серверу № клиента
и тд
0
19 / 19 / 2
Регистрация: 11.12.2010
Сообщений: 56
10.01.2011, 02:20
ну значит просто при подсоединении клиенту передаётся список всех подключенных клиентов вместе с их номерами, а пользователь уже выбирает нужный номер и далее передается серверу
0
1 / 1 / 2
Регистрация: 19.11.2009
Сообщений: 61
10.01.2011, 20:27  [ТС]
это пока не нада
потом я может быть сделаю чат для всех
и там всё

Добавлено через 8 минут
Цитата Сообщение от ua6lrl Посмотреть сообщение
по сути так
но я не тестил
код рабочий

Добавлено через 17 часов 53 минуты
вот в этой строчке идёт счётчик клиентов
C#
1
 private List<ConnectionInfo> connect = new List<ConnectionInfo>();
а тут он применяется
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private void AcceptConnections()
        {
            while (true)
            {
                
                // Принимаем соединение
                Socket socket = s.Accept();
                ConnectionInfo connection = new ConnectionInfo();
                connection.Socket = socket;
                // Создаем поток для получения данных
                connection.Thread = new Thread(ProcessConnection);
                connection.Thread.IsBackground = true;
                connection.Thread.Start(connection);
                // Сохраняем сокет
                lock (connect) connect.Add(connection);
            }
        }
так как же там где он применяется его можно изменять к кому его применить
для передачи другому клиенту
0
20 / 20 / 2
Регистрация: 27.08.2009
Сообщений: 71
10.01.2011, 21:28
так как же там где он применяется его можно изменять к кому его применить
для передачи другому клиенту
Не очень понял фразу.. но думаю Вы имеете ввиду... как обратиться к нужному клиенту?
В пакете в который Вы получили от клиента скажем второй байт у вас отвечает за id клиента и тогда делаем:
C#
1
connect.Find(с => с.id.ToString() == "1").Socket.Send(buffer);
вот в этой строчке идёт счётчик клиентов
Код C#1 private List<ConnectionInfo> connect = new List<ConnectionInfo>();
вот честно.. не вижу где тут счетчик...
Вот у Вас:
C#
1
2
3
4
5
// Принимаем соединение
                Socket socket = s.Accept();
                ConnectionInfo connection = new ConnectionInfo();
                connection.Socket = socket;
                connection.id = id++;
0
1 / 1 / 2
Регистрация: 19.11.2009
Сообщений: 61
10.01.2011, 21:39  [ТС]
Цитата Сообщение от dampir Посмотреть сообщение
вот честно.. не вижу где тут счетчик...
если разбирать пошагово то там можно посмотреть скока клиентов подключено "count"
0
20 / 20 / 2
Регистрация: 27.08.2009
Сообщений: 71
10.01.2011, 21:48
Сколько клиентво подключено это конечно хорошо! Но у Вас, у клиентов, нету индивидуальнах номеров... те они все едины... Выделить конкретного можно по айпи... что согласитесь не удобно...
Впринцепе можно по подключениям делать connect[1]... и тд.... но ктото ушел ктото пришел... это движение,а это не очень удобно...
0
1 / 1 / 2
Регистрация: 19.11.2009
Сообщений: 61
10.01.2011, 22:20  [ТС]
я это в полне понимаю но я зхател сделать хатя бы так что бы продолжить работу с сервером

Добавлено через 4 минуты
хм я чё то не пойму вот эту строчку
и Find что это
у меня клиент пока тока передаёт строку
без id я рассчитывал что сервер его номер будет передовать
0
20 / 20 / 2
Регистрация: 27.08.2009
Сообщений: 71
11.01.2011, 01:34
Ну что такое финд тебе msdn раскажет...
Я почитал что ты пишешь... но честно не особо выделил, что именнь ты хочешь от клинт серверного приложения... как я понял ты хочешь передовать от одного клиента к другому какую либо информацию....
Те клиент должнен знать о других клиентах (должен быть индификатор на сервере)....
0
1 / 1 / 2
Регистрация: 19.11.2009
Сообщений: 61
11.01.2011, 02:10  [ТС]
пока это не обязательно
допустим клиент знает номер другого
и передаёт это серверу а сервер должен его соединить с тем клиентом
0
20 / 20 / 2
Регистрация: 27.08.2009
Сообщений: 71
11.01.2011, 19:02
сделайте пакет: 1 байт - тип пакета, 1 байт - id, последующие байты - сообщение..
при конекте отправляете пакет вида
0 (скажем 0 тип это индификация) 12 (клиент с айди 12)
На сервере создаете
Dictionary<int, socket> con = new Dictionary<int, socket>();
при конекте записывае
C#
1
con.Add(buffer[1],sock);
а дальше уже при получении пакета смотрим
C#
1
2
3
4
if(buffer[0] == 1) \\скажем 1 это приват
{
   con[buffer[1]].Send(bufferSend);
}
0
19 / 19 / 2
Регистрация: 11.12.2010
Сообщений: 56
12.01.2011, 00:32
Прикрепляю архивчик. В нём находится простенькая реализация простенького сервера. Слушает порт, принимает подключения и обрабатывает пакеты. Использует две очереди для хранения пакетов (входящие, исходящие). Один из минусов - на каждого подключенного клиента открывается поток. Это критично при больших кол-вах клиентов. Сори, комменты не писал. Лениво да там итак всё просто. Поковыряйся, посмотри, может поможет чем.
Вложения
Тип файла: zip Server.zip (29.8 Кб, 45 просмотров)
0
20 / 20 / 2
Регистрация: 27.08.2009
Сообщений: 71
12.01.2011, 01:19
ua6lrl
С потоками все просто и понятно... а как реализовывается при большом количестве пользователей??
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.01.2011, 01:19
Помогаю со студенческими работами здесь

Многопоточный сервер: доступ клиентов к данным
Здравствуйте нашёл в интернете многопоточный сервер using System; using System.Collections.Generic; using System.Linq; using...

Как организовать многопоточный сервер через сокеты
Ребят, как создать сервер, который работает через сокеты и принимает сообщения от нескольких клиентов и на каждое принятое от них сообщение...

Решил сделать свой асинхронный многопоточный сервер
Итак. Цель создать асинхронный многопоточный сервер для MMOFPS (онлайн шутер от первого лица) на C#. Соответственно план такой: 1)...

Многопоточный сервер TCP: разослать сообщения по всем клиентам
Есть tcp сервер, который принимает данные от клиентов и выводит в консоль, и дает ответ клиенту. Уже сутки не могу решить одну...

Передача сообщения с сервера клиенту
Здравствуйте! Я только начинающий программист, пишу програмку для интернет клуба. И вот у меня два вопроса: 1) Подскажыте как можно на...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru