private void EstablishTransportConnection()
{
// Send the Server Initial multitransport
byte[] securityCookie = new byte[16];
Random rnd = new Random();
rnd.NextBytes(securityCookie);
Server_Initiate_Multitransport_Request_PDU requestPDU = rdpbcgrServer.CreateServerInitiateMultitransportRequestPDU(serverSessionContext, ++multitransportId, transportProtocol, securityCookie);
rdpbcgrServer.SendPdu(serverSessionContext, requestPDU);
//Create RDP-UDP Connection
CreateRdpeudpServer(this.serverSessionContext);
TransportMode transMode = TransportMode.Reliable;
if (transportProtocol == Multitransport_Protocol_value.INITITATE_REQUEST_PROTOCOL_UDPFECL)
{
transMode = TransportMode.Lossy;
}
rdpeudpSocket = rdpeudpServer.Accept(((IPEndPoint)serverSessionContext.Identity).Address, transMode, timeout);
if(rdpeudpSocket == null)
{
if (rdpeudpServer != null && rdpeudpServer.Running)
rdpeudpServer.Dispose();
throw new NotSupportedException("RDPEMT Server create rdpedupSocket failed.");
}
rdpemtServer = new RdpemtServer(rdpeudpSocket, rdpbcgrServer.AuthCertificate, true);
rdpemtServer.Received += ReceivedBytes;
uint receivedRequestId;
byte[] receivedCookie;
if (!rdpemtServer.ExpectConnect(timeout, out receivedRequestId, out receivedCookie))
{
throw new ProtocolViolationException("RDPEMT Server Expect Connection failed");
}
if (receivedRequestId != multitransportId || receivedCookie == null || receivedCookie.Length != 16)
{
throw new ProtocolViolationException("RDPEMT Server received a connection with un-expected request id or Cookie is null (or cookie's length is not 16)!");
}
for (int i = 0; i < receivedCookie.Length; i++)
{
if (receivedCookie[i] != securityCookie[i])
{
throw new ProtocolViolationException("RDPEMT Server received a connection with un-correct cookie!");
}
}
}