我通过我自己写的简易转发器测试.Net Core关于网络转发的功能,发现在Rtsp的转发上没有问题,但是RTP的UDP包转发则无法被正确解析,是不是我对协议的理解有疏漏,转发的相关代码如下
public class SocketTransmit
{
StreamSocketListener TcpOutListener = new StreamSocketListener();
StreamSocket TcpInSocket = new StreamSocket();
StreamSocket TcpOutSocket;
/// <summary>
/// 向内传递8300-8301端口
/// </summary>
DatagramSocket[] UdpInListenerList = new DatagramSocket[2];
/// <summary>
/// 向外传递临时端口
/// </summary>
DatagramSocket[] UdpOutListenerList = new DatagramSocket[2];
HostName UdpInRemoteAddress;
HostName UdpOutRemoteAddress;
public async void Listen()
{
await TcpInSocket.ConnectAsync(new EndpointPair(new HostName("10.1.100.39"), "10086", new HostName("10.1.100.36"), "554"));
TcpOutListener.ConnectionReceived += TcpOutListener_ConnectionReceived;
await TcpOutListener.BindServiceNameAsync("554");
Task.Run(new Action(ReadInStream));
}
public async void ReListen()
{
TcpOutListener.Dispose();
TcpInSocket.Dispose();
TcpOutListener = new StreamSocketListener();
TcpInSocket = new StreamSocket();
await TcpInSocket.ConnectAsync(new EndpointPair(new HostName("10.1.100.39"), "10086", new HostName("10.1.100.36"), "554"));
TcpOutListener.ConnectionReceived += TcpOutListener_ConnectionReceived;
await TcpOutListener.BindServiceNameAsync("554");
Task.Run(new Action(ReadInStream));
}
async void ReadInStream()
{
while (true)
{
StringBuilder request = new StringBuilder();
uint bufferSize = 2048;
byte[] data = new byte[bufferSize];
IBuffer buffer = data.AsBuffer();
try
{
await TcpInSocket.InputStream.ReadAsync(buffer, bufferSize, InputStreamOptions.Partial);
}
catch
{
//ReListen();
//return;
//TcpInSocket.Dispose();
//TcpInSocket = new StreamSocket();
//await TcpInSocket.ConnectAsync(new EndpointPair(new HostName("10.1.100.39"), "10086", new HostName("10.1.100.36"), "554"));
//TcpOutListener.ConnectionReceived += TcpOutListener_ConnectionReceived;
//Task.Run(new Action(ReadInStream));
//return;
//if (TcpOutSocket.Information.RemoteAddress != null)
//{
// TcpInSocket.Dispose();
// TcpInSocket = new StreamSocket();
// await TcpInSocket.ConnectAsync(new EndpointPair(new HostName("10.1.100.39"), "10086", new HostName("10.1.100.36"), "554"));
//}
//else
continue;
}
request.Append(Encoding.UTF8.GetString(data, 0, data.Length));
if (data[0] != 0)
{
if (request.ToString().Contains("client_port="))
{
string str = request.ToString();
int udpStart = int.Parse(str.Substring(request.ToString().IndexOf("client_port=") + "client_port=".Length, 5));
int udpEnd = int.Parse(str.Substring(request.ToString().IndexOf("client_port=") + "client_port=".Length + 6, 5));
for (int i = 0; i <= udpEnd - udpStart; i++)
{
if (i >= 10)
break;
UdpOutListenerList[i] = new DatagramSocket();
UdpOutListenerList[i].BindServiceNameAsync((udpStart + i).ToString());
UdpOutListenerList[i].MessageReceived += UdpOutListener_MessageReceived;
}
}
if (request.ToString().Contains("server_port="))
{
string str = request.ToString();
string intttt = str.Substring(request.ToString().IndexOf("server_port=") + "server_port=".Length, 4);
int udpStart = int.Parse(str.Substring(request.ToString().IndexOf("server_port=") + "server_port=".Length, 4));
int udpEnd = int.Parse(str.Substring(request.ToString().IndexOf("server_port=") + "server_port=".Length + 5, 4));
for (int i = 0; i <= udpEnd - udpStart; i++)
{
if (i >= 2)
break;
UdpInListenerList[i] = new DatagramSocket();
UdpInListenerList[i].BindServiceNameAsync((udpStart + i).ToString());
UdpInListenerList[i].MessageReceived += UdpInListener_MessageReceived;
}
}
}
try
{
await TcpOutSocket.OutputStream.WriteAsync(buffer);
await TcpOutSocket.OutputStream.FlushAsync();
}
catch
{
return;
}
}
}
private async void TcpOutListener_ConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
{
while (true)
{
try
{
StringBuilder request = new StringBuilder();
uint bufferSize = 1024;
byte[] data = new byte[bufferSize];
IBuffer buffer = data.AsBuffer();
uint dataRead = bufferSize;
await args.Socket.InputStream.ReadAsync(buffer, bufferSize, InputStreamOptions.Partial);
request.Append(Encoding.UTF8.GetString(data, 0, data.Length));
dataRead = buffer.Length;
TcpOutSocket = args.Socket;
if (data[0] != 0)
{
await TcpInSocket.OutputStream.WriteAsync(buffer);
await TcpInSocket.OutputStream.FlushAsync();
}
}
catch
{
break;
}
}
ReListen();
}
private async void UdpOutListener_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
{
StringBuilder request = new StringBuilder();
uint bufferSize = 4096;
byte[] data = new byte[bufferSize];
IBuffer buffer = data.AsBuffer();
uint dataRead = bufferSize;
await args.GetDataStream().ReadAsync(buffer, bufferSize, InputStreamOptions.Partial);
dataRead = buffer.Length;
int i = 0;
for (; i < 2; i++)
{
if (UdpInListenerList[i].Information.LocalPort == args.RemotePort)
break;
}
DataWriter dw = new DataWriter(await UdpInListenerList[i].GetOutputStreamAsync(UdpOutRemoteAddress, sender.Information.LocalPort));
dw.WriteBuffer(buffer);
await dw.StoreAsync();
await dw.FlushAsync();
dw.DetachStream();
}
private async void UdpInListener_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
{
StringBuilder request = new StringBuilder();
uint bufferSize = 4096;
byte[] data = new byte[bufferSize];
IBuffer buffer = data.AsBuffer();
uint dataRead = bufferSize;
UdpOutRemoteAddress = args.RemoteAddress;
await args.GetDataStream().ReadAsync(buffer, bufferSize, InputStreamOptions.Partial);
dataRead = buffer.Length;
int i = 0;
for (; i < 2; i++)
{
if (UdpOutListenerList[i].Information.LocalPort == args.RemotePort)
break;
}
DataWriter dw = new DataWriter(await UdpOutListenerList[i].GetOutputStreamAsync(new HostName("10.1.100.36"), sender.Information.LocalPort));
dw.WriteBuffer(buffer);
await dw.StoreAsync();
await dw.FlushAsync();
dw.DetachStream();
//await UdpInListenerList[i].OutputStream.WriteAsync(buffer);
}
}