Category: Utilidades


Se você estiver programando uma aplicação que use os vários IPs disponíveis na máquina para sair, seja usando as facilidades da classe ServicePoint, ou com Socket.Bind(), ou com alguma outra biblioteca por exemplo a LibCurl, e não estiver funcionando legal, é interessante isolar se o problema é com as configurações de sua rede ou na aplicação em si.

Screenshot

Screenshot do TestadorIPs

TestadorIPs é um aplicativo para testar isto. Muito simples e com apenas 421 linhas de código, interface gráfica feita em Gtk# (testado apenas no Mono), funcionando tanto no Windows quanto no Linux, e comprovada a eficácia através do sniffer Wireshark. Para a troca do IP utilizado nas conexões de saída são utilizadas as facilidades do BindIPEndPointDelegate da classe ServicePoint, do próprio Framework; as conexões são feitas utilizando a classe WebClient e para atestar o IP utilizado para sair, utilizado o site http://www.meuip.com.br. Baixe e na pasta correspondente a seu sistema operacional, rode o executável TestadorIPs.exe. Para rodar no Windows é necessário ter instalado as bibliotecas do Gtk# 2.12 (http://ftp.novell.com/pub/mono/gtk-sharp/gtk-sharp-2.12.10.win32.msi) .

Binários e código-fonte (compilado no Mono 2.6.7, solução do MonoDevelop 2.4): http://db.tt/xBCaeSF

Anúncios

Por vezes pode ser útil tratar uma stored procedure como se fosse uma tabela, fazendo um SELECT com ORDER BY ou WHERE. Um exemplo é o uso da stored procedure sp_who para ver as conexões atualmente abertas com o servidor de banco de dados. Pode-se agrupar por usuário conectado, por exemplo. Na net vi outras maneiras, talvez mais performáticas, de fazer este fuguete. Mas essa foi a mais simples que achei. Consiste em criar uma tabela temporária em memória, dar um INSERT nessa tabela usando os dados da stored procedure, e então fazendo o SELECT dessa tabela temporária. A estrutura da tabela deve ser compatível com o retorno da procedure.

declare @tmp table
 (
 spid int null,
 ecid int null,
 [status] nvarchar(max) null,
 loginname nvarchar(max) null,
 hostname nvarchar(max) null,
 blk int null,
 dbname nvarchar(max) null,
 cmd nvarchar(max) null,
 request_id int null
 );

 INSERT INTO @tmp
 exec sp_who;

 SELECT * FROM @tmp
 ORDER BY dbname desc

O .NET já tem embutido uma facilidade para compressão de dados com algoritmo Deflate e Gzip. Neste exemplo mostrarei como compactar e descompactar dados com Deflate, mas com GzipStream o processo é o mesmo.

A princípio parece complicado realizar essa compactação utilizando streams, mas na realidade é bem simples. O DeflateStream é um wrapper stream, ele envolve um outro stream que é onde os dados serão salvos; você grava os dados no DeflateStream, o DeflateStream grava compactado no stream de destino. Para descompactar, o processo é o inverso, você lê do DeflateStream, e o DeflateStream lê do stream de origem realizando a descompactação on-the-fly.

Para exemplificar o processo, deixo aqui dois métodos, um que realiza a compactação de um array de bytes através do DeflateStream e do MemoryStream, e um que faz a descompactação.

private static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[32768];
while (true)
{
int read = input.Read(buffer, 0, buffer.Length);
if (read <= 0) return;
output.Write(buffer, 0, read);
}
}

public static byte[] Compactar(byte[] arrayOrigem)
{
byte[] arrayComprimido;
using (MemoryStream origem = new MemoryStream(arrayOrigem, false))
{
using (MemoryStream destino = new MemoryStream())
{
using (DeflateStream compress = new DeflateStream(destino, CompressionMode.Compress))
{
CopyStream(origem, compress);
}
arrayComprimido = destino.ToArray();
}
}
return arrayComprimido;
}

public static byte[] Descompactar(byte[] arrayOrigem)
{
byte[] arrayDescomprimido;
using (MemoryStream origem = new MemoryStream(arrayOrigem, false))
{
using (MemoryStream destino = new MemoryStream())
{
using (DeflateStream decompress = new DeflateStream(origem, CompressionMode.Decompress))
{
CopyStream(decompress, destino);
}
arrayDescomprimido = destino.ToArray();
}
}
return arrayDescomprimido;
}

Pegando seu IP externo em C#

Às vezes você precisa saber qual IP sua aplicação está usando para sair para a internet, principalmente quando uma máquina tem vários IPs.
Este métodozinho foguete usa o site www.meuip.com.br para pegar seu IP de saída:

public static string PegarIPExterno()
        {
            System.Net.WebClient t = new System.Net.WebClient();
            string meuip = t.DownloadString("http://meuip.datahouse.com.br");
            return meuip
                .Substring(
                meuip.IndexOf("o Meu IP? ") + "o Meu IP? ".Length,
                meuip.IndexOf("</title>") - meuip.IndexOf("o Meu IP? ")
                - "o Meu IP? ".Length);
        }

Calculando MD5 sums em C#

O .NET já tem embutido um hasher MD5, mas ele gera array de bytes, e não aquela string hexadecimal bonitinha (ex. 7285a29ee745d94a6335d0d986438bad).

Segue então uma classezinha foguete que faz isso:

public static class CalculadoraHash

{

public static string CalcularMD5 (string caminho)

{

FileStream fs = new System.IO.FileInfo (caminho).OpenRead ();

try

{

MD5 md5 = new MD5CryptoServiceProvider ();

// Constrói a string final convertendo cada byte para hex

// e colocando numa string

string resultado = "";

foreach (byte b in md5.ComputeHash (fs)) {

resultado += b.ToString ("x2");

}

return resultado;

}

finally

{

fs.Close ();

}

}

}