Manual de Sockets en C#
Manual de Sockets en C#
Manual de Sockets en C#
SOCKETS
En este proyecto nos hemos decantado por los sockets para implementar la
comunicacin cmara-ordenador. Son responsables del importante papel de enviar los
comandos que provocan el movimiento de la cmara, as como de recibir las
imgenes que captamos a travs de ella. Por ello, creemos necesario dedicarles esta
seccin.
7.1 QU SON?
Los sockets son la interfaz ms difundida que hay para la comunicacin de
procesos. Socket designa un concepto abstracto por el cual dos programas
(posiblemente situados en computadoras distintas) pueden intercambiarse cualquier
flujo de datos, de manera transparente, sin conocer los detalles de como se transmiten
esos datos, y generalmente de manera fiable y ordenada.
Para que dos programas puedan comunicarse entre si es necesario que un
programa sea capaz de localizar al otro, y adems, que ambos programas sena
capaces de intercambiarse cualguier secuencia de octetos, es decir, datos relevantes a
su finalidad.
Para ello son necesarios los tres recursos que originan el concepto de socket, y
gracias a los cuales ste queda definido:
7.2 SOCKETS EN C#
La programacin de sockets en .NET es posible gracias a la clase Socket
presente en el espacio de nombres System.Net.Sockets. Esta clase Socket tiene varios
mtodos y propiedades y un constructor.
7.2.1 Creacin
El primer paso es crear un objeto de esta clase, usando el constructor para ello.
As es como creamos el socket:
move_cam = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Cdigo 7.1: declaracin de un socket
7.2.2 Conexin
Una vez hemos creado un socket necesitamos crear una conexin con el
servidor. Las dos aplicaciones que necesitan comunicarse tienen primero que crear
una conexin entre ellas. Las dos aplicaciones necesitarn identificar a la otra.
Veamos como funciona esto en .NET.
Para conectar con la computadora remota necesitamos conocer la direccin IP y
el puerto al cual conectar. En .NET hay una clase en el espacio de nombres
System.Net llamada IPEndPoint, la cual representa una como una direccin IP y un
nmero de puerto. Para conseguir la direccin dada por una cadena de caracteres se
usa el mtodo Parse. Una vez el punto final est listo se usa el mtodo Connect de la
clase Socket para conectar al punto final (el servidor o computadora remota).
IPEndPoint RemoteCam = new
System.Net.IPEndPoint(IPAddress.Parse("192.168.1.253"),80);
move_cam.Connect(RemoteCam);
Cdigo 7.2: conexin de un socket con un servidor conocido
try
{
}
catch (SocketException se)
{
MessageBox.Show ( se.Message );
}
byte [] Rx = new byte[1024];
int iRx = move_cam.Receive(Rx);
Cdigo 7.3: ejemplo de enviar y recibir sncronamente con un socket
Sockets Asncronos
La clase Socket de .NET ofrece un mtodo llamado BeginReceive para recibir
datos asncronamente, es decir, de manera que no exista bloqueo. Necesita que se le
pase, entre otros parmetros, un buffer, que ser donde se almacenen los datos
recibidos, y una funcin callback que (delegado) que ser llamada en cualquier que se
reciban datos. Esto significa que la funcin BeginAsyncRead, ha sido completada. A
continuacin se muestran las signaturas de ambas funciones:
La funcin OnConnect hace una conexin con el servidor y luego una llamada a
WaitForData. Si nos ceimos a lo que es la recepcin de datos, esto es integramente
hecho en WaitForData, que crea la funcin callback y hace una llamada a
BeginReceive pasndole un buffer global y la funcin callback. Cuando los datos
llegan OnDataReceive es llamado y, por consiguiente, el mtodo EndReceive del
socket, que devolver el nmero de bytes recibidos. A partir de aqu habr que
gestionar los datos recibidos, en este caso son copiado en una cadena y se realiza una
nueva llamada a WaitForData, que llamar BeginReceive otra vez y as
sucesivamente.
En el lado del servidor, la aplicacin tiene que enviar y recibir datos. Pero
adems, el servidor tiene que permitir a los clientes hacer conexiones. El servidor no
necesita conocer la direccin IP del cliente. Realmente no le importa dnde est el
cliente porque no es l, sino el cliente, el responsable de hacer la conexin. La
responsabilidad del servidor es gestionar las conexiones del cliente.
En el lado del servidor se tiene un socket llamado oyente que escucha un
nmero de puerto especfico para conexiones de cliente. Cuando el cliente hace una
conexin, el servidor necesita aceptarla y entonces, se envan y reciben datos a travs
del socket que han conseguido al aceptar la conexin. El siguiente cdigo ilustra
cmo el servidor escucha las conexiones y las acepta:
public Socket m_socListener;
public void StartListening()
{
m_socListener = new
Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPEndPoint ipLocal = new IPEndPoint ( IPAddress.Any ,8221);
m_socListener.Bind( ipLocal );
m_socListener.Listen (4);
m_socListener.BeginAccept(new AsyncCallback ( OnClientConnect ),null);
cmdListen.Enabled = false;
}
public void OnClientConnect(IAsyncResult asyn)
{
m_socWorker = m_socListener.EndAccept (asyn);
WaitForData(m_socWorker);
}
Cdigo 7.7: implementacin de socket en servidor