A small tool for deploying VMware ESXi from another computer running with Microsoft Windows.
DotNet framework runtime 4.o is required.
Freeware.
Let's make harmony harmonious.
A small tool for deploying VMware ESXi from another computer running with Microsoft Windows.
DotNet framework runtime 4.o is required.
Freeware.
using System;
using System.Collections.Generic;
namespace SecretNest.RecursiveEnumerator
{
/// <summary>
/// Get the enumerator for querying the parents of specified item.
/// </summary>
/// <typeparam name="T">Item type</typeparam>
/// <param name="current">Item for querying parents</param>
/// <returns>Enumerator of parents querying</returns>
public delegate IEnumerator<T> GetParentsEnumerator<T>(T current);
/// <summary>
/// Enumerator for querying parents
/// </summary>
/// <typeparam name="T">Item type</typeparam>
public class Enumerator<T> : IEnumerator<T>
{
T current, initial;
Queue<T> notQueried = new Queue<T>();
HashSet<T> queried = new HashSet<T>(); //for avoiding duplicated query
Queue<T> rollbackHistory = new Queue<T>(); //for soft reset
Queue<T> history = new Queue<T>(); //for soft reset
IEnumerator<T> activeQuery;
/// <summary>
/// Callback for getting the enumerator, which is used for querying the parents of specified item.
/// </summary>
public GetParentsEnumerator<T> GetParentsEnumeratorCallback { get; set; }
/// <summary>
/// Constructor
/// </summary>
/// <param name="initial">Initial item</param>
public Enumerator(T initial)
{
notQueried.Enqueue(initial);
this.initial = initial;
}
/// <summary>
/// Constructor
/// </summary>
/// <param name="initial">Initial item</param>
/// <param name="callback">Callback for getting the enumerator, which is used for querying the parents of specified item.</param>
public Enumerator(T initial, GetParentsEnumerator<T> callback)
{
notQueried.Enqueue(initial);
this.initial = initial;
GetParentsEnumeratorCallback = callback;
}
/// <summary>
/// Gets the current element in the collection.
/// </summary>
public T Current
{
get { return current; }
}
bool disposed;
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
current = default(T);
notQueried = null;
queried = null;
history = null;
}
disposed = true;
}
}
/// <summary>
/// Gets the current element in the collection.
/// </summary>
object System.Collections.IEnumerator.Current
{
get { return current; }
}
/// <summary>
/// Skip same items
/// </summary>
public bool SkipSameItems { get; set; }
/// <summary>
/// Advances the enumerator to the next element of the collection.
/// </summary>
/// <returns>true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection. </returns>
public bool MoveNext()
{
if (disposed) throw new ObjectDisposedException(null);
if (rollbackHistory.Count > 0)
{
current = rollbackHistory.Dequeue();
history.Enqueue(current);
return true;
}
if (activeQuery != null)
{
here:
if (activeQuery.MoveNext())
{
if (SkipSameItems && history.Contains(activeQuery.Current)) { goto here; }
current = activeQuery.Current;
history.Enqueue(current);
notQueried.Enqueue(current);
return true;
}
else
{
activeQuery = null;
}
}
if (GetParentsEnumeratorCallback != null)
{
while (notQueried.Count != 0)
{
T item = notQueried.Dequeue();
if (!queried.Contains(item))
{
IEnumerator<T> enumerator = GetParentsEnumeratorCallback(item);
queried.Add(item);
here:
if (enumerator != null)
{
if (enumerator.MoveNext())
{
activeQuery = enumerator;
if (SkipSameItems && history.Contains(enumerator.Current)) { goto here; }
current = enumerator.Current;
history.Enqueue(current);
notQueried.Enqueue(current);
return true;
}
else
{
enumerator = null;
}
}
}
}
}
return false;
}
/// <summary>
/// Sets the enumerator to its initial position, which is before the first element in the collection. Keep all histories for caching.
/// </summary>
public void Reset()
{
if (disposed) throw new ObjectDisposedException(null);
while (history.Count > 0)
{
rollbackHistory.Enqueue(history.Dequeue());
}
current = default(T);
}
/// <summary>
/// Sets the enumerator to its initial position, which is before the first element in the collection. Reset all data, and close active sub-query.
/// </summary>
public void HardReset()
{
if (disposed) throw new ObjectDisposedException(null);
queried.Clear();
notQueried.Clear();
notQueried.Enqueue(initial);
history.Clear();
activeQuery = null;
current = default(T);
}
}
}
虽然Socks5已经不是新技术,最近又有好多人来询问我如何使用Socks5代理来连接远端TCP。在这里我就顺便把之前的流程文件贴来啦。
1 使用TCP连接到Socks5代理服务器端口
2 发送5 2 0 2(4个字节,为Byte而非数字字符,下同)
3 接受到5 0(表示不需要密码,跳转到步骤6)或者5 2(需要密码验证)
4 发送1 UserNameLength(1字节) UserName(1-255字节) PasswordLength(1字节) Password(1-255字节)
5 接受到1 0表示成功,否则失败。
6 如果需要远程解析DNS,那么发送:5 1 0 3 DomainNameLength(1字节) DomainName(1-255字节) Port(2字节)
如果本地解析DNS得IP,那么发送:5 1 0 1 IP(4字节) Port(2字节)
7 可能得到反馈:只要打头是5 0则表示成功,否则表示失败。但是应该完整的清理此数据,它的格式是以下中的一种:
5 0 0 1 IP(4字节) Port(2字节)
5 0 0 3 DomainNameLength(1字节) DomainName(1-255字节) Port(2字节)
8 至此完成连接,然后你就可以当作标准的TCP连接来收发数据了,直至连接关闭。