Sie sind auf Seite 1von 19

Sockets para Linux.

Programación Básica
ACM
{jvergara,jgato}@gsyc.escet.urjc.es

2003
Contenidos 1

Contenidos

Introducción
Diferentes tipos de sockets
Direcciones IP y puertos
Estructuras de Datos
Funciones para programar con sockets
Ejemplo Servidor de Flujo.
Ejemplo Cliente de Flujo.

2003
c h{jvergara,jgato}@gsyc.escet.urjc.esi Sockets para Linux. Programación Básica
Introducción 2

Introducción

Un socket es una herramienta que permite la comunicación entre


procesos.
Librerı́a Sockets.
Los sockets normalmente se apoyan en TCP o UDP. (Seguro o no
seguro).
Los sockets permiten comunicar procesos entre máquinas remotas.
Ası́ funciona http, ftp, telnet, etc. Internet, Internet, Internet...
Por ejemplo, pedir una web usa sockets a través del puerto 80.

2003
c h{jvergara,jgato}@gsyc.escet.urjc.esi Sockets para Linux. Programación Básica
Diferentes tipos de sockets 3

Diferentes tipos de sockets

Existen dos tipos: Sockets de Flujo y sockets de Datagramas.


Sockets de Flujo ⇒ definen flujos de comunicación en dos direccio-
nes, fiables. Si envı́as dos items a través del socket en el orden ”1,
2”llegarán al otro extremo en el orden ”1, 2”, y sin pérdidas. Usan
TCP.
Sockets de Datagramas ⇒ definen flujos de comunicación no fiables.
Si envı́as dos items a través del sockets en el orden ”1, 2”puede que
no lleguen en ese orden. Incluso puede que algún item no llegue. Usan
UDP.
Nos centraremos en los primeros ya que la mayorı́a de las aplicaciones
se basan en Sockets de Flujo.

2003
c h{jvergara,jgato}@gsyc.escet.urjc.esi Sockets para Linux. Programación Básica
Direcciones IP y Puertos 4

Direcciones IP y Puertos

Es necesario indicar con quien nos vamos a comunicar al construir el


socket. IP y puertos.
Sockets tiene funciones para manejar IPs y puertos.
En los ejemplos veremos esas funciones.

2003
c h{jvergara,jgato}@gsyc.escet.urjc.esi Sockets para Linux. Programación Básica
Estructuras de Datos 5

Estructuras de Datos

Las estructuras son usadas en la programación de sockets para alma-


cenar información sobre la comunicación.
struct sockaddr_in
{
short int sin_family; //Tipo IPv4, IPv6, Local...
unsigned short int sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};

2003
c h{jvergara,jgato}@gsyc.escet.urjc.esi Sockets para Linux. Programación Básica
Modelo cliente 6

Modelo cliente

Descripción básica del funcionamiento de un cliente.


Socket();
Connect();
Send();

2003
c h{jvergara,jgato}@gsyc.escet.urjc.esi Sockets para Linux. Programación Básica
Funciones para programar con sockets 7

Funciones para programar con sockets

int socket(int domain,int type,int protocol);


Devuelve un socket(descriptor de fichero) que luego utilizaremos para
mandar/recibir datos o -1 en caso de error.
Domain ⇒ AF INET( protocolos de Internet),AF UNIX(socket para
comunicación interna del sistema). Estas son las más usadas ....
Type ⇒ SOCK STREAM (sockets de flujo, fiables) o SOCK DGRAM(sockets
de datagramas, no fiables).
Protocol ⇒ Por defecto se pone a 0, que es IP. Más información en
/etc/protocols

2003
c h{jvergara,jgato}@gsyc.escet.urjc.esi Sockets para Linux. Programación Básica
Funciones para programar con sockets 8

Funciones para programar con sockets

int connect(int fd, struct sockaddr *serv_addr,


int addrlen);
Usada para conectarse a un puerto en una dirección IP. El cliente
antes de mandar datos, hace un connect a la máquina destino.
Devuelve -1 en caso de error.
Fd ⇒ Es el descriptor del archivo socket devuelto por la llamada.
Serv addr ⇒ Es un puntero a la estrutura sockaddr la cual contiene
la dirección IP destino y el puerto.
Addrlen ⇒ Contiene la longitud de la estructura sockaddr a la cual
apunta el puntero my addr.

2003
c h{jvergara,jgato}@gsyc.escet.urjc.esi Sockets para Linux. Programación Básica
Funciones para programar con sockets 9

Funciones para programar con sockets

int send( int fd ,const void *msg ,int len ,int


flags);
Manda los datos a través del socket al destino que se ha elegido al
rellenar la estructura del socket.
Devuelve el numero de bytes mandados o -1 en caso de error.
Fd ⇒ Es el descriptor del archivo socket devuelto por la llamada.
Msg ⇒ Puntero a lo que se quiere mandar.
Len ⇒ Longitud en bytes de lo que se quiere manda.
Flag ⇒ Se pone a 0.

2003
c h{jvergara,jgato}@gsyc.escet.urjc.esi Sockets para Linux. Programación Básica
Modelo servidor 10

Modelo servidor

Descripción básica del funcionamiento de un servidor.


Socket();
Bind();
Listen(); En conexiones TCP, orientadas a conexión
Accept(); En conexiones TCP, orientadas a conexión
Recv();

2003
c h{jvergara,jgato}@gsyc.escet.urjc.esi Sockets para Linux. Programación Básica
Funciones para programar con sockets 11

Funciones para programar con sockets

int bind(int fd, struct sockaddr *my_addr,int


addrlen);
Bind da al socket la dirección que esta en la estructura sockaddr. Esto
se conoce como asignar un nombre a un descriptor.
Devuelve -1 en caso de error.
Fd ⇒ Es el descriptor del archivo socket devuelto por la llamada.
My addr ⇒ Es un puntero a una estructura sockaddr.
Addrlen ⇒ Contiene la longitud de la estructura sockaddr a la cual
apunta el puntero my addr.

2003
c h{jvergara,jgato}@gsyc.escet.urjc.esi Sockets para Linux. Programación Básica
Funciones para programar con sockets 12

Funciones para programar con sockets

int listen(int fd, int backlog);


Para recibir conexiones creas un socket, luego con listen indicas que
quieres conexiones entrantes, además indicas el tamaño de la cola de
conexiones entrantes que quieres tener.
Devuelve -1 en caso de error.
Fd ⇒ Es el descriptor del archivo socket devuelto por la llamada.
Backlog ⇒ Número de conexiones que se admiten.

2003
c h{jvergara,jgato}@gsyc.escet.urjc.esi Sockets para Linux. Programación Básica
Funciones para programar con sockets 13

Funciones para programar con sockets

int accept(int fd, void *addr, int *addrlen);


Se usa para aceptar conexiones de otras máquinas. Una llamada a
accept extrae la primera conexión de la cola de conexiones entrantes.
Nos devolverá un nuevo socket con el que atenderemos esta cone-
xión(recv).
Devuelve -1 en caso de error.
Fd ⇒ Es el descriptor del archivo socket devuelto por la llamada.
Addr ⇒ Es un puntero a una estructura sockaddr in para determinar
de donde queremos que nos conecten ip:puerto.
Addrlen ⇒ Es la longitud de la estructura a la que se apunta el
argumento addr. sizeof(struct sockaddr in).

2003
c h{jvergara,jgato}@gsyc.escet.urjc.esi Sockets para Linux. Programación Básica
Funciones para programar con sockets 14

Funciones para programar con sockets

int recv(int fd, void *buf, int len, unsigned


int flags);
Se usa para recibir datos.
Devuelve el numero de bytes recibidos o -1 en caso de error.
Fd ⇒ Es el descriptor del archivo socket devuelto por la llamada.
Buf ⇒ Es el buffer donde se guarda la información recibida.
Len ⇒ La longitud máxima del buffer.
Flags ⇒ Se pone a 0
Esta función devuelve el numero de bytes recibidos.

2003
c h{jvergara,jgato}@gsyc.escet.urjc.esi Sockets para Linux. Programación Básica
Funciones para programar con sockets 15

Funciones para programar con sockets

close(fd);
Cierra la conexión de nuestro socket.
Devuelve -1 en caso de error.
Fd ⇒ Es el descriptor del archivo socket devuelto por la llamada.

2003
c h{jvergara,jgato}@gsyc.escet.urjc.esi Sockets para Linux. Programación Básica
Funciones para programar con sockets 16

Funciones para programar con sockets

struct hostent gethostbyname(const char *name);


Consigue la dirección IP del dominio name.

2003
c h{jvergara,jgato}@gsyc.escet.urjc.esi Sockets para Linux. Programación Básica
Funciones para programar con sockets 17

Funciones para programar con sockets

int gethostname(char *hostname, size_t size);


Consigue el nombre de la máquina local.

2003
c h{jvergara,jgato}@gsyc.escet.urjc.esi Sockets para Linux. Programación Básica
Seguridad en las comunicaciones 18

Seguridad en las comunicaciones

Tenemos HTTPS,SSL(secure sockets)...


Utilizamos mecanimos como certificados, clave publica/privada ...
SSL esta por encima de TCP, permite conexiones seguras entre el
cliente y servidor, servidor autentifica a cliente y/o cliente autentifica
servidor..

2003
c h{jvergara,jgato}@gsyc.escet.urjc.esi Sockets para Linux. Programación Básica

Das könnte Ihnen auch gefallen