PDF de programación - 7. Sockets

Imágen de pdf 7. Sockets

7. Socketsgráfica de visualizaciones

Publicado el 27 de Marzo del 2018
1.047 visualizaciones desde el 27 de Marzo del 2018
137,6 KB
8 paginas
Creado hace 14a (12/09/2009)
7. SOCKETS
7. SOCKETS

En este proyecto nos hemos decantado por los sockets para implementar la

comunicación cámara-ordenador. Son responsables del importante papel de enviar los
comandos que provocan el movimiento de la cámara, así como de recibir las
imágenes que captamos a través de ella. Por ello, creemos necesario dedicarles esta
sección.

7.1 ¿QUÉ SON?

Los sockets son la interfaz más difundida que hay para la comunicación 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 además, 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:

– Un protocolo de comunicaciones, que permite el intercambio de octetos.

– Una dirección del Protocolo de Red (dirección IP, si se utiliza el protocolo

TCP/IP), que identifica una computadora.

– Un número de puerto, que identifica a un programa dentro de una

computadora.

1

De aquí se deduce que la propiedades inherentes a los sockets dependen de las
características del protocolo en el que se implementan. El protocolo más utilizado es
TCP, gracias al cual los sockets tienen las propiedades de ser orientados a conexión y
de garantizar la transmisión de todos los octetos sin errores ni omisiones, y que éstos
llegan a su destino en el mismo orden en que se transmitieron.

Aunque también puede usarse el protocolo UDP. Éste es un protocolo no

orientado a conexión. Sólo se garantiza que si un mensaje llega, llega bien. En ningún
caso se garantiza que llege o que lleguen los mensajes en el mismoorden que se
mandaron. Esto lo hace adecuado para el envío de mensajes frecuentes pero no
demasiado importantes, como por ejemplo, mensajes para los refrescos
(actualizaciones) de un gráfico.

En los orígenes de Internet, las primeras computadoras en implementar sus

protocolos fueron aquellas de la universidad de Berkeley. Dicha implementación tuvo
lugar en una variante del sistema operativo Unix conocida como BSD Unix. Pronto
se hizo evidente que los programadores necesitarían un medio sencillo y eficaz para
escribir programas capaces de intercomunicarse entre sí. Esta necesidad dio origen a
la primera especificación e implementación de sockets, también en Unix, en 1981,
conocidos como BSD sockets (o Berkeley sockets). Se hicieron para proveer al
desarrollador de una API mediante la cual pudiera utilizar el protocolo sin
complicaciones. Hoy día son un estándar de facto, y están implementados como
bibliotecas de programación para multitud de sistemas operativos.

Los sockets se caracterizan por ser una interfaz mediante la cual podemos

comunicarnos con otros procesos, utilizando descriptores de ficheros. Es decir, como
todo en Unix se realiza escribiendo y leyendo ficheros, los sockets se basan en esto
también. Cuando establecemos una comunicación entre dos sockets, cada uno tiene
un descriptor de fichero en el que escribe y lee para comunicarse con el otro socket.

Figura 7.1: socket entre dos anfitriones

2

Los sockets permiten implementar una arquitectura cliente-servidor. La

comunicación ha de ser iniciada por uno de los programas que se denomina programa
cliente. El segundo programa espera a que otro inicie la comunicación, por este
motivo se denomina programa servidor.

Desde el punto de vista de programación, un socket no es más que un fichero

que se abre de una manera especial. Así, un socket es un fichero existente en la
máquina cliente y en la máquina servidora, que sirve en última instancia para que el
programa servidor y el cliente lean y escriban la información. Esta información será
la transmitida por las diferentes capas de red.

Los sockets, al ser de bajo nivel, no resultan muy cómodos para el programador.
Al no permitir el paso directo de argumento, el programador tiene que encargarse de
abrir/cerrar los flujos de entrada/salida, colocar en ellos los argumentos que quiere
pasar, extraer los resultados, etc. Además están muy ligados a la plataforma donde se
ejecutan y el código es difícil de reutilizar. Pero por otro lado los sockets son rápidos,
al ser de bajo nivel introducen poca sobrecarga a las aplicaciones, lo que los hace
ideales para nuestra aplicación. Y como son tan populares y difundidos,
prácticamente todos los lenguajes de programación los soportan, y por supuesto
también que aquí se emplea.

7.2 SOCKETS EN C#

La programación 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
métodos y propiedades y un constructor.

7.2.1 Creación

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);

Código 7.1: declaración de un socket

El primer parámetro es la familia de la dirección (AddressFamily) que será

usada, en este caso, InterNetwork ( que viene a ser IP versión 4). Con el siguiente
especificamos el tipo de socket, escogiendo sockets fiables orientados a conexión y
de doble sentido (stream) en vez de no fiables y no orientados a conexión
(datagramas). Obviamente, especificamos Stream como tipo y finalmente estaremos
usando TCP/IP, por lo que especificamos Tcp como tipo de protocolo.

3

7.2.2 Conexión

Una vez hemos creado un socket necesitamos crear una conexión con el

servidor. Las dos aplicaciones que necesitan comunicarse tienen primero que crear
una conexión entre ellas. Las dos aplicaciones necesitarán identificar a la otra.
Veamos como funciona esto en .NET.

Para conectar con la computadora remota necesitamos conocer la dirección 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 dirección IP y un
número de puerto. Para conseguir la dirección dada por una cadena de caracteres se
usa el método Parse. Una vez el punto final está listo se usa el método 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);

Código 7.2: conexión de un socket con un servidor conocido

Si el servidor está funcionando y escuchando, la conexión tendrá éxito. Si en

cambio el servidor no está operativo, será lanzada una excepción llamada
SocketException. Asumiendo que la conexión está hecha, ya se puede mandar
información al otro lado.

7.2.3 Sockets Síncronos/asíncronos

Cuando un lado (cliente o servidor) envía información al otro lado se que éste

tiene que leer los datos. Pero, ¿cómo sabe el otro lado que la información ha llegado?
Hay dos opciones: la aplicación comprueba regularmente si han llegado datos o
alguna clase de mecanismo notifica a la aplicación y ésta puede leer los datos en ese
momento.

Sockets Síncronos

Se manda información de una aplicación a otra usando el método Send. Send

bloquea, es decir, espera hasta que los datos hayan sido enviados o hasta que se lance
un excepción. De la misma forma que hay un método Send para enviar existe un
método Receive para recibir los bytes. Igualmente, Receive bloquea la ejecución del
programa hasta que algún tipo de información sea recibida o hasta que se lance una
excepción.

En este código se muestra como se envía una cadena Txx: todo lo que se mande

ha de hacerse en forma de bytes, por lo que previamente hay que convertir los
caracteres en bytes. A continuación, se recibe un chorro de bytes proveniente del
servidor, que quedan almacenados en el vector Rx, y la longitud de éste en iRx.

4

try
{
String Txx = "Hello There";
byte[] Txx = System.Text.Encoding.ASCII.GetBytes(Txx);
move_cam.Send(Txx);
}
catch (SocketException se)
{
MessageBox.Show ( se.Message );
}
byte [] Rx = new byte[1024];
int iRx = move_cam.Receive(Rx);

Código 7.3: ejemplo de enviar y recibir síncronamente con un socket

Sockets Asíncronos

La clase Socket de .NET ofrece un método llamado BeginReceive para recibir
datos asíncronamente, es decir, de manera que no exista bloqueo. Necesita que se le
pase, entre otros parámetros, un buffer, que será donde se almacenen los datos
recibidos, y una función callback que (delegado) que será llamada en cualquier que se
reciban datos. Esto significa que la función BeginAsyncRead, ha sido completada. A
continuación se muestran las signaturas de ambas funciones:

Public IAsyncResul BeginReceive (byte[] buffer, int offset, int size,
SocketFlags socketFlags, AsyncCallback callback, object state)
void AsyncCallback (IAsyncResult ar)

Código 7.4: signatura de BeginReceive y su método callback

El método callback devuelve void y recibe un parámetro, interfaz IAsyncResult,

que contiene el estado de la operación asíncrona.

Digamos que hacemos una llamada a BeginReceive y después de un tiempo los
datos llegan y nuestra función callback es llamada. Los datos están ahora disponibles
en el buffer que se pasó como primer parámetro, cuando se hizo la llamada al método
BeginReceive.

Pero antes de acceder al buffer es necesario llamar a la función EndReceive
sobre el socket. EndReceive devolverá el número de bytes recibidos. No es legal
acceder al buffer antes de llamar a EndReceive. El siguiente código muestra como
hacer una recepción asíncrona:

5

byte[] m_DataBuffer = new byte [10];
IAsyncResult m_asynResult;
public AsyncCallback pfnCallBack ;
public Socket m_s
  • Links de descarga
http://lwp-l.com/pdf9925

Comentarios de: 7. Sockets (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad