private void ExecuteRequest(IRequestPacket request, IPEndPoint clientEP, CancellationToken cancellationToken) { switch (request.Op) { case TftpOperation.ReadRequest: ExecuteRead(request.FileName, clientEP, cancellationToken); break; case TftpOperation.WriteRequest: ExecuteWrite(request.FileName, clientEP, cancellationToken); break; default: Console.WriteLine("Requested operation unknown"); break; } }
// Listen for TFTP request packets on the port specified by bindPort. private void Listen(int bindPort, CancellationToken cancellationToken) { IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0); using (TftpConnection listener = new TftpConnection(bindPort)) { Func <ITftpPacket, bool> requestFilter = (ITftpPacket packet) => { IRequestPacket rq = packet as IRequestPacket; if (rq != null) { if (rq.Mode == TftpMode.octet) { return(true); } else { Console.WriteLine("Modes other than octet are not supported."); } } else { Console.WriteLine("Main listener recieved non-request TFTP packet."); } return(false); }; while (true) { IRequestPacket request = (IRequestPacket)listener.Receive(requestFilter, out remoteEP, cancellationToken); _requestHandlerTasks.Add(Task.Factory.StartNew( action: () => ExecuteRequest(request, remoteEP, _cancellationTokenSource.Token), cancellationToken: _cancellationTokenSource.Token, creationOptions: TaskCreationOptions.LongRunning, scheduler: TaskScheduler.Default)); } } }