Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1 / 1 / 0
Регистрация: 19.10.2021
Сообщений: 51

Проблема с TCP

15.12.2022, 16:52. Показов 2606. Ответов 34
Метки tcp (Все метки)

Студворк — интернет-сервис помощи студентам
Всех приветствую, пишу онлайн игру с сервером на c#. Два клиента подключаются к серверу, движение первого, кто подключился идеально синхронизируются у второго, а вот со вторым проблема - либо задержка примерно секунд 10, либо вообще ничего. Сделал небольшую откладку, первый клиент не получает данные, но отправляет, со вторым наоборот, а сервер получает и отправляет от обоих. Ссылка на видео: https://youtu.be/5nRDaFwVCww

Сервер
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
using static Packets;
using System.Net;
using System.Net.Sockets;
using System.Numerics;
using System.Runtime.InteropServices;
 
internal class Server
{
 
 
    private static async Task Main(string[] args)
    {
        const int Port = 8888;
        int CountPlayers = 0;
 
        int MaxPlayers = 10;
 
        TcpListener server = new TcpListener(IPAddress.Any, Port);
 
        Connections[] connections = new Connections[MaxPlayers];
 
        try
        {
            server.Start();
            Console.WriteLine($"Сервер запущен на порте: {Port}");
            while (true)
            {
                TcpClient client = await server.AcceptTcpClientAsync();
                if (CountPlayers < MaxPlayers) Task.Run(async () => await OnConnected(client));
            }
        }
        catch { }
        static bool IsSocketConnected(Socket s)
        {
            return !(s.Poll(1000, SelectMode.SelectRead) && s.Available == 0 || !s.Connected);
        }
 
 
 
        async Task OnConnected(TcpClient _client)
        {
            NetworkStream stream = _client.GetStream();
 
            CountPlayers++;
 
            int PlayerId = 0;
 
            _client.Client.NoDelay = true;
 
            for (int i = 0; i < connections.Length; i++) // Выдача идентификатора
            {
                if (connections[i] == null)
                {
                    connections[i] = new Connections();
                    connections[i].stream = stream;
                    PlayerId = i;
                    connections[i].ID = PlayerId;
                    break;
                }
            }
            PacketSender packetSender = new PacketSender(connections, PlayerId);
 
            Console.WriteLine($"Клиент: {_client.Client.RemoteEndPoint} поключился. Количество игроков: {CountPlayers}");
 
            var response = new List<byte>();
            int bytesRead = 1;
 
            while (connections[PlayerId].objectName == null)
            {
                while ((bytesRead = stream.ReadByte()) != '\n')
                {
                    response.Add((byte)bytesRead);
                }
                switch (response.ToArray()[0])
                {
                    case (byte)PacketIDs.SelectedObject:
                        {
                            SelectedObject str = new SelectedObject();
                            int size = Marshal.SizeOf(str);
                            IntPtr ptr = IntPtr.Zero;
                            ptr = Marshal.AllocHGlobal(size);
                            Marshal.Copy(response.ToArray(), 1, ptr, size);
                            str = (SelectedObject)Marshal.PtrToStructure(ptr, str.GetType());
                            connections[PlayerId].objectName = str.ObjectName;
                            Console.WriteLine($"{connections[PlayerId].objectName}");
                            response.Clear();
                            break;
                        }
                }
                response.Clear();
            }
            packetSender.Send(new RPCInstance(PlayerId, connections[PlayerId].objectName, false), Target.Others);
            for (int i = 0; i < connections.Length; i++)
            {
                if (connections[i] != null && i == PlayerId)
                {
                    packetSender.Send(new RPCInstance(i, connections[i].objectName, true), Target.Self);
                    
                }else if(connections[i] != null && i != PlayerId)
                {
                    packetSender.Send(new RPCInstance(i, connections[i].objectName, false), Target.Self);
                }
            }
 
            while (IsSocketConnected(_client.Client))
            {
                if(connections[PlayerId] != null)
                {
                    packetSender.Send(new PlayerSync(PlayerId, connections[PlayerId].Position, Vector3.Zero), Target.Others);
                }                
                if (_client.Available > 0)
                {
                    try
                    {
                        while ((bytesRead = stream.ReadByte()) != '\n')
                        {
                            response.Add((byte)bytesRead);
                        }
                        switch (response.ToArray()[0])
                        {
                            case (byte)PacketIDs.SelectedObject:
                                {
                                    SelectedObject str = new SelectedObject();
                                    int size = Marshal.SizeOf(str);
                                    IntPtr ptr = IntPtr.Zero;
                                    ptr = Marshal.AllocHGlobal(size);
                                    Marshal.Copy(response.ToArray(), 1, ptr, size);
                                    str = (SelectedObject)Marshal.PtrToStructure(ptr, str.GetType());
                                    connections[PlayerId].objectName = str.ObjectName;
                                    Console.WriteLine($"{connections[PlayerId].objectName}");
                                    response.Clear();
                                    break;
                                }
                            case (byte)PacketIDs.GetPlayerSync:
                                {
                                    GetPlayerSync str = new GetPlayerSync();
                                    int size = Marshal.SizeOf(str);
                                    IntPtr ptr = IntPtr.Zero;
                                    ptr = Marshal.AllocHGlobal(size);
                                    Marshal.Copy(response.ToArray(), 1, ptr, size);
                                    str = (GetPlayerSync)Marshal.PtrToStructure(ptr, str.GetType());
                                    connections[PlayerId].Position = str.position;
                                    Console.WriteLine($"Пакет получен: {connections[PlayerId].ID} {connections[PlayerId].Position}");
                                    response.Clear();
                                    break;
                                }
                        }
                        response.Clear();
                    }
                    catch { }
                }
 
            }
            packetSender.Send(new RPCDestroy(PlayerId), Target.Others);
            connections[PlayerId] = null;
            CountPlayers--;
 
            Console.WriteLine($"Клиент: {_client.Client.RemoteEndPoint} отключился количество игроков: {CountPlayers}");
            _client.Close();
        }
    }
}
Клиент
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
using System;
using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using UnityEngine;
using static Packets;
using System.Runtime.InteropServices;
using Unity.VisualScripting;
using UnityEngine.UI;
 
public class RiseNetWork : MonoBehaviour
{
    const string IP = "127.0.0.1";
    const int Port = 8888;
    static TcpClient client = new TcpClient();
 
    const int MaxPlayers = 10;
 
    NetworkStream stream;
 
    public int myId;
 
    public GameObject[] SyncObjects = new GameObject[MaxPlayers];
 
    public InputField inputField;
    public Button button;
 
    List<byte> response = new List<byte>();
    int bytesRead = 1;
    PacketSender packetSender;
    private void Start()
    {
 
 
    }
    public void StartingGame()
    {
        if (inputField.text != "")
        {
 
            inputField.gameObject.SetActive(false);
            button.gameObject.SetActive(false);
            client.Connect(IP, Port);
            client.Client.NoDelay = true;
            stream = client.GetStream();
            
            packetSender = new PacketSender(stream);
            packetSender.Send(new SelectedObject(inputField.text));
        }
    }
    private void Update()
    {
        if(packetSender != null)
        {
            if (SyncObjects[myId] != null)
            {
                packetSender.Send(new SendPlayerSync(SyncObjects[myId].transform.position.x, SyncObjects[myId].transform.position.y, SyncObjects[myId].transform.position.z));
                Debug.Log($"Отправлено: {SyncObjects[myId].transform.position.x} {SyncObjects[myId].transform.position.y} {SyncObjects[myId].transform.position.z}");
            }
            if (client.Available > 0)
            {
                try
                {
                    while ((bytesRead = stream.ReadByte()) != '\n')
                    {
                        response.Add((byte)bytesRead);
                    }
                    switch (response.ToArray()[0])
                    {
                        case (byte)PacketIDs.RPCInstance:
                            {
                                RPCInstance str = new RPCInstance();
                                int size = Marshal.SizeOf(str);
                                IntPtr ptr = IntPtr.Zero;
                                ptr = Marshal.AllocHGlobal(size);
                                Marshal.Copy(response.ToArray(), 1, ptr, size);
                                str = (RPCInstance)Marshal.PtrToStructure(ptr, str.GetType());
                                RPCInstance(str.id, str.ObjectName, str.isMine);
                                response.Clear();
                                break;
                            }
 
                        case (byte)PacketIDs.RPCDestroy:
                            {
                                RPCDestroy str = new RPCDestroy();
                                int size = Marshal.SizeOf(str);
                                IntPtr ptr = IntPtr.Zero;
                                ptr = Marshal.AllocHGlobal(size);
                                Marshal.Copy(response.ToArray(), 1, ptr, size);
                                str = (RPCDestroy)Marshal.PtrToStructure(ptr, str.GetType());
 
                                RPCDestroy(str.id);
                                response.Clear();
                                break;
                            }
                        case (byte)PacketIDs.PlayerSync:
                            {
                                GetPlayerSync str = new GetPlayerSync();
                                int size = Marshal.SizeOf(str);
                                IntPtr ptr = IntPtr.Zero;
                                ptr = Marshal.AllocHGlobal(size);
                                Marshal.Copy(response.ToArray(), 1, ptr, size);
                                str = (GetPlayerSync)Marshal.PtrToStructure(ptr, str.GetType());
                                Debug.Log($"Получено {str.PlayerID} {str.position.X} {str.position.Y} {str.position.Z}");
                                if (SyncObjects[str.PlayerID] != null)
                                {
                                    SyncObjects[str.PlayerID].transform.position = new Vector3(str.position.X, str.position.Y, str.position.Z);
                                }
                                response.Clear();
                                break;
                            }
                    }
                    response.Clear();
 
                }
                catch (Exception ex) { Debug.LogError(ex); }
            }
        }
 
    }
 
    
    #region RPCs
    void RPCInstance(int _id, string _objectName, bool isMine)
    {
        SyncObjects[_id] = Instantiate(Resources.Load<GameObject>(_objectName));
        SyncObjects[_id].GetComponent<RiseView>().stream = stream;
        SyncObjects[_id].GetComponent<RiseView>().id = _id;
        if (isMine)
        {
            SyncObjects[_id].GetComponent<RiseView>().IsMine = true;
            myId = _id;
        }
    }
 
    void RPCDestroy(int _id)
    {
        Destroy(SyncObjects[_id]);
        SyncObjects[_id] = null;
    }
    #endregion
}
Пакеты
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.Diagnostics;
using System.Numerics;
using System.Runtime.InteropServices;
using static Packets;
 
public enum Target
{
    Self,
    Others,
    All,
    Current
}
public enum PacketIDs : byte
{
    //OUTCOMING
    RPCInstance = 0,
    RPCDestroy = 1,
    PlayerSync = 2,
    //INCOMING
    SelectedObject = 3,
    GetPlayerSync = 4,
}
public class PacketSender
{
    public Connections[] connections;
    int playerId;
    public PacketSender(Connections[] _connections, int _playerId)
    {
        connections = _connections;
        playerId= _playerId;
    }
    public async void Send<T>(T Packet, Target target) where T : Packets
    {
        List<byte> bytes = new();
        switch (Packet)
        {
            case Packets.RPCInstance:
                bytes.Add((byte)PacketIDs.RPCInstance);
                break;
            case Packets.RPCDestroy:
                bytes.Add((byte)PacketIDs.RPCDestroy);
                break;
            case Packets.PlayerSync:
                bytes.Add((byte)PacketIDs.PlayerSync);
                break;
        }
        int size = Marshal.SizeOf(Packet);
        byte[] arr = new byte[size];
        IntPtr ptr = ptr = Marshal.AllocHGlobal(size);
        Marshal.StructureToPtr(Packet, ptr, true);
        Marshal.Copy(ptr, arr, 0, size);
        bytes.AddRange(arr);
        bytes.Add((byte)'\n');
        switch (target)
        {
            case Target.Self:
                await connections[playerId].stream.WriteAsync(bytes.ToArray());
                break;
            case Target.Others:
                for (int i = 0; i < connections.Length; i++)
                {
                    if (connections[i] != null && connections[i] != connections[playerId])
                    {
                        await connections[i].stream.WriteAsync(bytes.ToArray());
                        Console.WriteLine("Пакет отправлен");
                    }
                }
                break;
            case Target.All:
                for(int i = 0; i < connections.Length; i++)
                {
                    if (connections[i] != null)
                    {
                        await connections[i].stream.WriteAsync(bytes.ToArray());
                    }
                }
                break;
        }
    }
}
public interface Packets
{
    #region OUTCOMING
    public struct RPCInstance : Packets
    {
        public int id;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)]
        public string ObjectName;
        public bool isMine;
        public RPCInstance(int _id, string _objectName, bool isMine)
        {
            id = _id;
            this.isMine= isMine;
            ObjectName = _objectName;
        }
    }
    public struct RPCDestroy : Packets
    {
        public int id;
        public RPCDestroy(int _id)
        {
            id = _id;
        }
    }
    public struct PlayerSync : Packets
    {
        public int PlayerID;
        public Vector3 position;
        public Vector3 rotation;
        public PlayerSync(int _playerID, Vector3 _pos, Vector3 _rot)
        {
            PlayerID = _playerID;
            position = _pos;
            rotation = _rot;
        }
    }
    #endregion
    #region INCOMING
    public struct SelectedObject : Packets
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)]
        public string ObjectName;
        public SelectedObject(string selectObject)
        {
            ObjectName = selectObject;
        }
    }
    public struct GetPlayerSync : Packets
    {
        public Vector3 position;
        public GetPlayerSync(float _xposition, float _yposition, float _zposition)
        {
            position.X = _xposition;
            position.Y = _yposition;
            position.Z = _zposition;
        }
    }
    #endregion
 
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.12.2022, 16:52
Ответы с готовыми решениями:

таймер и таймаут tcp проблема
короче, если не доступен порт на удаленном компьютере программа зависает на 30 секунд примерно, решил завершить соединение принудительно...

Сцена зависает при запуске TCP-клиента, когда он подключен к TCP - серверу, при этом TCP-клиент полностью функционирует
Проблема описана в заголовке, и хотелось бы услышать ваше мнение, о том как можно решить проблему. Скрипт TCP-клиента на сцене: ...

Проблема с TCP
Всех приветствую! Суть вопроса такова, пользователь подключается ДОПУСТИМ к чату Условия: Есть Сервер, а есть Клиент Клиентов...

34
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
16.12.2022, 18:30
Студворк — интернет-сервис помощи студентам
Unity123, minimal reproducible example, это минимальный пример с кодом для повторения вашей проблемы. т.е вам нужно предоставить либо консольный проект клиента и консольный проект сервера, либо сделать консольный проект сервера+ проект с юнити. Я же вам написал что сделайте проект консольный, сначала без передачи координат, а допустим проект чата консольного. и вы сразу наглядно отловите все свои ошибки.
1
1 / 1 / 0
Регистрация: 19.10.2021
Сообщений: 51
17.12.2022, 07:06  [ТС]
Спасибо, думаю, стоит и в правду на чужих и рабочих примерах чатов попробовать, а после уже и на юнити переписать

Добавлено через 2 минуты
Я пострел только что пример чата, и там действительно чтение и запись разделены на две асинхронных задачи
0
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,079
17.12.2022, 09:25
Unity123, По идее в сервер-клиент системе надо все пакеты отправлЯть в баитах, а у вас все в разных структурах в массиве. Может из за этого?? Сервер не находит каких то маленьких значений тиипа Idв структурах и поэтому разсинхрон.
0
1 / 1 / 0
Регистрация: 19.10.2021
Сообщений: 51
17.12.2022, 11:35  [ТС]
Нет, нет, не в этом дело, конец сообщение определяется байтом '\n', а структуры сериализуются. Один клиент идеально виден у второго, а у второго первый с задержкой в секунд 5
0
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,079
17.12.2022, 13:39
Цитата Сообщение от Unity123 Посмотреть сообщение
а структуры сериализуются
в сколько баит? Если они все разные, как? я не увидел где
0
1 / 1 / 0
Регистрация: 19.10.2021
Сообщений: 51
17.12.2022, 13:43  [ТС]
По разному, там от типа данных зависит, первым байтом передаю название структуры, остальными уже саму структуру
0
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,079
17.12.2022, 14:17
просто все в кучу поворот позиция - позиция поворот

Добавлено через 30 минут
В минимуме должен быть такой пакет
Вложение 1389617а потом распечатывать по байтам к каждой величине
0
1 / 1 / 0
Регистрация: 19.10.2021
Сообщений: 51
17.12.2022, 15:58  [ТС]
не открывается вложение
0
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,079
18.12.2022, 13:19
Цитата Сообщение от Unity123 Посмотреть сообщение
case (byte)PacketIDs.PlayerSync:
                            {
                                GetPlayerSync str = new GetPlayerSync();
                                int size = Marshal.SizeOf(str);
                                IntPtr ptr = IntPtr.Zero;
                                ptr = Marshal.AllocHGlobal(size);
                                Marshal.Copy(response.ToArray(), 1, ptr, size);
                                str = (GetPlayerSync)Marshal.PtrToStructure(pt r, str.GetType());
                                Debug.Log($"Получено {str.PlayerID} {str.position.X} {str.position.Y} {str.position.Z}");
                                if (SyncObjects[str.PlayerID] != null)
                                {
                                    SyncObjects[str.PlayerID].transform.position = new Vector3(str.position.X, str.position.Y, str.position.Z);
                                }
                                response.Clear();
                                break;
                            }
Может тут str.PlayerID не существует вы преобразовали str = (GetPlayerSync), если актуально еще
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PlayerSync str = new PlayerSync();
                                int size = Marshal.SizeOf(str);
                                IntPtr ptr = IntPtr.Zero;
                                ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(response.ToArray(), 1, ptr, size);
                                str = (PlayerSync)Marshal.PtrToStructure(ptr, str.GetType());
int id = str.PlayerID;
//иаиди получил и тогда уже так можно попробовать
GetPlayerSync strG = new GetPlayerSync();
size = Marshal.SizeOf(strG);
                                
ptr = Marshal.AllocHGlobal(size);
                                Marshal.Copy(response.ToArray(), 1, ptr, size);
                                strG = (GetPlayerSync)Marshal.PtrToStructure(ptr, strG.GetType());
                                Debug.Log($"Получено {id} {strG.position.X} {strG.position.Y} {strG.position.Z}");
                                if (SyncObjects[id] != null)
                                {
                                    SyncObjects[id].transform.position = new Vector3(strG.position.X, strG.position.Y, strG.position.Z);
                                }
Добавлено через 17 минут
хотя не
C#
1
SyncObjects[id].transform.position = strG.position;
0
1 / 1 / 0
Регистрация: 19.10.2021
Сообщений: 51
19.12.2022, 16:07  [ТС]
Не работает, тут суть в том, что объекты синхронизируются, но один идеально синхронизирован, практически без задержки, а второй тоже синхронизирован, но с задержкой 5-10 секунд, я оставлял ссылку на ютуб, там продемонстрированно, и архив с сервером и клиентом, чтобы увидеть проблему. Всё-равно спасибо за помощь, я очень благодарен
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,236
19.12.2022, 16:11
Цитата Сообщение от Unity123 Посмотреть сообщение
что объекты синхронизируются, но один идеально синхронизирован, практически без задержки, а второй тоже синхронизирован, но с задержкой 5-10 секунд,
А отладкой вы умеете пользоваться? Берете отладчик и вперед.
Если не можете целиком весь репозиторий предоставить, чтобы запустить и посмотреть, то почему мы тут гадать должны?
0
1 / 1 / 0
Регистрация: 19.10.2021
Сообщений: 51
19.12.2022, 17:03  [ТС]
Просто оба проекта кинуть?
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
22.12.2022, 07:36
Unity123, Я тут глянул еще ваш код, у вас будет память утекать. Потому как вы выделяете память в куче, копируете туда данные, дальше или упаковываете или распаковываете объект но при этом эту память вы не очищаете. надо вызывать обязательно Marshal.FreeHGlobal(ptr);
1
1 / 1 / 0
Регистрация: 19.10.2021
Сообщений: 51
23.12.2022, 16:11  [ТС]
Это после каждой десериализации делать?
0
1 / 1 / 0
Регистрация: 19.10.2021
Сообщений: 51
27.12.2022, 19:17  [ТС]
Проблема была решена многопоточностью, чтение в отдельном потоке, обработка в основном, использовал UnityMainThreadDispatcher для вызова методов из неосновного потока
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.12.2022, 19:17

проблема с tcp ip в VS2008 need help!
#include &quot;stdafx.h&quot; #define WIN32_LEAN_AND_MEAN #include &lt;stdio.h&gt; #include &lt;Winsock2.h&gt;//ws2_32.lib #include...

Проблема с подвержением в TCP
Здравствуйте! Я пишу прогу по обмену данными по TCP между промышленным контроллером и настольным ПК с WinXP. Задача стоит в следующем:...

Проблема с реализицией Tcp клиента
Есть сервер, который слушает от нас сообщение и отвечает нам. Там вроде все нормально работает( сообщение от клиента серверу приходит, тот...

Проблема с объединением сообщений при передаче по TCP
Вообщем делаю регистрацию и авторизацию клиента на сервере. Клиент: private void button1_Click(object sender, EventArgs e) { ...

Heroes 3: проблема с сетевой игрой по протоколу TCP/IP
Скачал сборку. Поставил, локальная сеть настроена, то есть пинг есть и компы видят друг друга( доступы открыты), игра запускается все...


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru