Skip to content
This repository was archived by the owner on Jul 11, 2023. It is now read-only.

Commit 09d2370

Browse files
committed
修复kcpchannel的bug
1 parent c817f6b commit 09d2370

File tree

1 file changed

+40
-39
lines changed

1 file changed

+40
-39
lines changed

Assets/GameFramework/Network/KcpChannel.cs

Lines changed: 40 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,14 @@ public static UInt32 iclock()
4545
#endregion
4646

4747

48-
public KcpChannel(string ip,int port,Action<byte[]> reveiveHandler)
48+
public KcpChannel(int port,Action<byte[]> reveiveHandler)
4949
{
5050
_allEndPoint = new IPEndPoint(IPAddress.Parse("255.255.255.255"), port);
5151
_recEndPoint = new IPEndPoint(IPAddress.Any, 0);
5252

5353
_reveiveHandler = reveiveHandler;
5454

55-
_udpClient = new UdpClient(new IPEndPoint(IPAddress.Parse(ip), port));
55+
_udpClient = new UdpClient(new IPEndPoint(IPAddress.Any, port));
5656
_kcp = new KCP((UInt32) new Random((int) DateTime.Now.Ticks).Next(1, Int32.MaxValue),
5757
UdpSendData);
5858

@@ -62,13 +62,22 @@ public KcpChannel(string ip,int port,Action<byte[]> reveiveHandler)
6262

6363
_receiveMeesages = new Queue<byte[]>();
6464

65-
Thread revThread = new Thread(ReceiveMessage);
66-
revThread.Start();
67-
Thread updataThread = new Thread(Update);
65+
_udpClient.BeginReceive(ReceiveMessage, this);
66+
67+
Thread updataThread = new Thread(Update);
6868
updataThread.Start();
69-
}
69+
updataThread.IsBackground = true;
70+
}
71+
72+
private void ReceiveMessage(IAsyncResult asyncCallback)
73+
{
74+
byte[] datas = _udpClient.EndReceive(asyncCallback,ref _recEndPoint);
75+
_receiveMeesages.Enqueue(datas);
76+
_udpClient?.BeginReceive(ReceiveMessage,this);
77+
}
78+
7079

71-
public void Connect(string ip, int port)
80+
public void Connect(string ip, int port)
7281
{
7382
_targetEndPoinnt = new IPEndPoint(IPAddress.Parse(ip), port);
7483
_currentEndPoint = _targetEndPoinnt;
@@ -86,42 +95,34 @@ public void Send(byte[] datas,bool toAll=false)
8695
_currentEndPoint = _allEndPoint;
8796
else
8897
_currentEndPoint = _targetEndPoinnt;
89-
_kcp?.Send(datas);
90-
}
91-
92-
private void ReceiveMessage()
93-
{
94-
while (true)
95-
{
96-
byte[] datas = _udpClient.Receive(ref _recEndPoint);
97-
if (datas != null)
98-
{
99-
_receiveMeesages.Enqueue(datas);
100-
}
101-
}
98+
_kcp?.Send(datas);
10299
}
103100

101+
104102
private void Update()
105103
{
106-
while (_receiveMeesages.Count > 0)
107-
{
108-
var buf = _receiveMeesages.Dequeue();
109-
110-
_kcp.Input(buf);
111-
// mNeedUpdateFlag = true;
112-
113-
for (var size = _kcp.PeekSize(); size > 0; size = _kcp.PeekSize())
114-
{
115-
var buffer = new byte[size];
116-
if (_kcp.Recv(buffer) > 0)
117-
{
118-
_reveiveHandler(buffer);
119-
}
120-
}
121-
}
122-
123-
_kcp.Update(iclock());
124-
Thread.Sleep(10);
104+
while (true)
105+
{
106+
if (_receiveMeesages.Count > 0)
107+
{
108+
var buf = _receiveMeesages.Dequeue();
109+
110+
_kcp.Input(buf);
111+
// mNeedUpdateFlag = true;
112+
113+
for (var size = _kcp.PeekSize(); size > 0; size = _kcp.PeekSize())
114+
{
115+
var buffer = new byte[size];
116+
if (_kcp.Recv(buffer) > 0)
117+
{
118+
_reveiveHandler(buffer);
119+
}
120+
}
121+
}
122+
123+
_kcp.Update(iclock());
124+
Thread.Sleep(10);
125+
}
125126
}
126127

127128

0 commit comments

Comments
 (0)