|
|
@ -11,7 +11,7 @@ namespace STcpHelper |
|
|
|
|
|
|
|
|
|
|
|
private List<TcpClient> _clients; |
|
|
|
private List<TcpClient> _clients; |
|
|
|
|
|
|
|
|
|
|
|
private readonly int HEADER_SIZE = 4; |
|
|
|
private readonly int HEADER_SIZE = STcpPacketHeader.HEADER_LENGTH; |
|
|
|
private readonly int BUFFER_SIZE; |
|
|
|
private readonly int BUFFER_SIZE; |
|
|
|
private int _port; |
|
|
|
private int _port; |
|
|
|
|
|
|
|
|
|
|
@ -56,14 +56,14 @@ namespace STcpHelper |
|
|
|
while (true) |
|
|
|
while (true) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int headerBytesRead = await stream.ReadAsync(headerBuffer, 0, HEADER_SIZE); |
|
|
|
int headerBytesRead = await stream.ReadAsync(headerBuffer, 0, HEADER_SIZE); |
|
|
|
if (headerBytesRead != 4) |
|
|
|
if (headerBytesRead != HEADER_SIZE) |
|
|
|
{ |
|
|
|
{ |
|
|
|
WriteError(new Exception("Cannot read header")); |
|
|
|
WriteError(new Exception("Cannot read header")); |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
STcpPacketHeader header = new STcpPacketHeader(headerBuffer); |
|
|
|
STcpPacketHeader header = new STcpPacketHeader(headerBuffer); |
|
|
|
short dataSize = header.DataLength; |
|
|
|
int dataSize = header.DataLength; |
|
|
|
int totalRecv = 0; |
|
|
|
int totalRecv = 0; |
|
|
|
while (totalRecv < dataSize) |
|
|
|
while (totalRecv < dataSize) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -71,10 +71,11 @@ namespace STcpHelper |
|
|
|
totalRecv += dataBytesRead; |
|
|
|
totalRecv += dataBytesRead; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
WriteMessage($"[{client.Client.RemoteEndPoint.ToString()}] Type: {header.Type.ToString()}"); |
|
|
|
|
|
|
|
|
|
|
|
if (header.Type == PacketType.TEXT) |
|
|
|
if (header.Type == PacketType.TEXT) |
|
|
|
{ |
|
|
|
{ |
|
|
|
STcpTextPacket packet = new STcpTextPacket(dataBuffer); |
|
|
|
STcpTextPacket packet = new STcpTextPacket(dataBuffer); |
|
|
|
WriteMessage($"[{client.Client.RemoteEndPoint.ToString()}] Type: {header.Type.ToString()}"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Broadcast |
|
|
|
// Broadcast |
|
|
|
BroadcastMessage(packet.Text, client); |
|
|
|
BroadcastMessage(packet.Text, client); |
|
|
@ -83,11 +84,18 @@ namespace STcpHelper |
|
|
|
else if (header.Type == PacketType.REQ_CLIENT_LIST) |
|
|
|
else if (header.Type == PacketType.REQ_CLIENT_LIST) |
|
|
|
{ |
|
|
|
{ |
|
|
|
STcpClientListResPacket packet = new STcpClientListResPacket(_clients); |
|
|
|
STcpClientListResPacket packet = new STcpClientListResPacket(_clients); |
|
|
|
WriteMessage($"[{client.Client.RemoteEndPoint.ToString()}] Type: {header.Type.ToString()}"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Send |
|
|
|
// Send |
|
|
|
SendPacket(packet, client); |
|
|
|
SendPacket(packet, client); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
else if (header.Type == PacketType.REQ_FILE) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
STcpFileReqPacket recvPacket = new STcpFileReqPacket(dataBuffer); |
|
|
|
|
|
|
|
STcpFileResPacket packet = new STcpFileResPacket(recvPacket.Path); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Send async |
|
|
|
|
|
|
|
SendAsyncPacket(packet, client); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (!IsClientConnected(client)) |
|
|
|
if (!IsClientConnected(client)) |
|
|
|
break; |
|
|
|
break; |
|
|
@ -123,6 +131,26 @@ namespace STcpHelper |
|
|
|
if (!IsClientConnected(requester)) |
|
|
|
if (!IsClientConnected(requester)) |
|
|
|
return; |
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (responseByte.Length < BUFFER_SIZE) |
|
|
|
|
|
|
|
requester.GetStream().WriteAsync(responseByte, 0, responseByte.Length); |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
int totalSend = 0; |
|
|
|
|
|
|
|
while (totalSend < responseByte.Length) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
int sendCount = responseByte.Length - totalSend < BUFFER_SIZE ? responseByte.Length - totalSend : BUFFER_SIZE; |
|
|
|
|
|
|
|
requester.GetStream().WriteAsync(responseByte, totalSend, sendCount); |
|
|
|
|
|
|
|
totalSend += sendCount; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private async void SendAsyncPacket(ISTcpAsyncPacket packet, TcpClient requester) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
byte[] responseByte = await packet.Serialize(); |
|
|
|
|
|
|
|
if (!IsClientConnected(requester)) |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
requester.GetStream().WriteAsync(responseByte, 0, responseByte.Length); |
|
|
|
requester.GetStream().WriteAsync(responseByte, 0, responseByte.Length); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|