Ik heb een class geschreven die data over tcp/ip verstuurd naar een server.
Deze 'data packages' zijn als volgt opgebouwd:
[WORD] Packet groote
[PACKET]
Nu is het probleem dat verschillende threads tegelijkertijd Packages kunnen versturen waardoor de packages door elkaar gaan lopen:
[[WORD]Dit is [[WORD]Dit is package 2] package 1]
Ik heb al geprobeerd lock's toe te voegen maar dit heeft blijkbaar geen nut.
Deze 'data packages' zijn als volgt opgebouwd:
[WORD] Packet groote
[PACKET]
Nu is het probleem dat verschillende threads tegelijkertijd Packages kunnen versturen waardoor de packages door elkaar gaan lopen:
[[WORD]Dit is [[WORD]Dit is package 2] package 1]
Ik heb al geprobeerd lock's toe te voegen maar dit heeft blijkbaar geen nut.
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
| public class Server { private System.Net.Sockets.TcpClient pr_tcpClient; private System.Threading.Thread pr_parseThread; private bool pr_isConnected = false; private byte[] pr_buffer = new byte[5120]; private string pr_parseBuffer = ""; private System.Net.IPAddress pr_ipAddress; private int pr_portNumber; public delegate void connectedDelegate(); public event connectedDelegate Connected; public delegate void disconnectedDelegate(); public event disconnectedDelegate Disconnected; public delegate void packetReceivedDelegate(string Packet); public event packetReceivedDelegate PacketReceived; public bool isConnected { get { return pr_isConnected; } } public void Connect(string Hostname, int PortNumber) { pr_buffer = new byte[5120]; pr_parseBuffer = ""; System.Threading.Thread.Sleep(3000); pr_isConnected = false; System.Net.IPAddress[] _ipAddresses = System.Net.Dns.GetHostAddresses(Hostname); pr_ipAddress = null; foreach (System.Net.IPAddress _ipAddress in _ipAddresses) { if (_ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { pr_ipAddress = _ipAddress; break; } } pr_portNumber = PortNumber; if (pr_ipAddress != null) { pr_tcpClient = new System.Net.Sockets.TcpClient(); pr_tcpClient.BeginConnect(pr_ipAddress, pr_portNumber, new AsyncCallback(this.connectCallback), null); } } private void reConnect() { System.Threading.Thread.Sleep(3000); pr_tcpClient.BeginConnect(pr_ipAddress, pr_portNumber, new AsyncCallback(this.connectCallback), null); } public void Disconnect() { // Close ParseThread if (pr_parseThread != null) { pr_parseThread.Abort(); pr_parseThread = null; } try { System.Net.Sockets.NetworkStream _networkStream = pr_tcpClient.GetStream(); _networkStream.Flush(); } catch { } Console.WriteLine("Connection closed"); pr_tcpClient.Close(); pr_isConnected = false; if (this.Disconnected != null) { this.Disconnected(); } } public void Send(string Packet) { try { lock (pr_tcpClient.GetStream()) { System.IO.StreamWriter _streamWriter = new System.IO.StreamWriter(pr_tcpClient.GetStream()); _streamWriter.Write(Packet); _streamWriter.Flush(); } } catch { } } private void connectCallback(IAsyncResult ar) { try { pr_tcpClient.EndConnect(ar); pr_isConnected = true; pr_parseThread = new System.Threading.Thread(new System.Threading.ThreadStart(this.parseThread)); pr_parseThread.Start(); if (this.Connected != null) { this.Connected(); } Console.WriteLine("Connected to server."); pr_tcpClient.GetStream().BeginRead(pr_buffer, 0, 5120, new AsyncCallback(this.receiveCallback), null); } catch (Exception Ex) { Console.WriteLine(Ex.Message); this.reConnect(); } } private void receiveCallback(IAsyncResult ar) { int _bytesRead = 0; try { try { lock (pr_tcpClient.GetStream()) { _bytesRead = pr_tcpClient.GetStream().EndRead(ar); } } catch { } if (_bytesRead < 1) { try { System.Net.Sockets.NetworkStream _networkStream = pr_tcpClient.GetStream(); _networkStream.Flush(); } catch { } pr_tcpClient.Client.Shutdown(System.Net.Sockets.SocketShutdown.Both); pr_tcpClient.Close(); pr_isConnected = false; Console.WriteLine("Connection closed by server."); if (this.Disconnected != null) { this.Disconnected(); } return; } string _received = System.Text.Encoding.UTF8.GetString(pr_buffer, 0, _bytesRead); lock (pr_parseBuffer) { pr_parseBuffer += _received; } lock (pr_tcpClient.GetStream()) { pr_tcpClient.GetStream().BeginRead(pr_buffer, 0, 5120, new AsyncCallback(this.receiveCallback), null); } } catch { } } private void parseThread() { do { System.Threading.Thread.Sleep(100); if (pr_parseBuffer.Length > 1) { int _packetLength = InstanceId.Routines.getWord(pr_parseBuffer.Substring(0, 2)); lock (pr_parseBuffer) { pr_parseBuffer = pr_parseBuffer.Remove(0, 2); } do { System.Threading.Thread.Sleep(250); } while (pr_parseBuffer.Length < _packetLength); string _packet = pr_parseBuffer.Substring(0, _packetLength); lock (pr_parseBuffer) { pr_parseBuffer = pr_parseBuffer.Remove(0, _packetLength); } if (this.PacketReceived != null) { this.PacketReceived(packet); } } } while (pr_isConnected == true); } } |