Sunteți pe pagina 1din 5

Práctica 18

Mayo 2018

/* Sockets */

Los sockets proveen com unicación punto a punto de dos vías entre dos
procesos. Los sockets son m uy versátiles y son la base de com unicación
interprocesos. Un socket es un punto extrem o de com unicación al cual un
nom bre puede ligarse. Éste tiene un tipo y uno o m as procesos asociados.
Los sockets existen en dom inios de com unicación.

Un dom inio socket es una abstracción que provee una estructura de


direccionam iento y un conjunto de protocolos. Los sockets conectan solo
con otros sockets en el m ism o dom inio. Se identifican veintitrés dom inios
(ver <sys/ socket.h>), de los cuales solo los dom inios Unix e I nternet son
los norm alm ente usados en Solaris 2.x Los sockets pueden usarse para
com unicarse entre dos procesos en un sistem a único. Com o en otras
form as de procesos inter com unicantes (I P C: I nterprocess
com m unicating)

El dom inio Unix provee un espacio de direccionam iento de socket en un


sistem a único. Los dom inios Unix son nom brados con trayectorias Unix.
Los sockets tam bién pueden ser usados para com unicar entre procesos en
diferentes sistem as. El espacio de direccionam iento socket entre dos
sistem as conectados es denom inado el dom inio I nternet. La com unicación
de éste últim o usa el conjunto de protocolos de internet TCP / I P .

Tipos de Sockets (socket type). Definen las propiedades de com unicación


visibles a la aplicación. Los procesos com unican solo entre sockets del
m ism o tipo. Existen cinco tipos de socket.

‘Stream socket’
P rovee flujo de datos de dos vías, secuencial, confiable, y no duplicado sin
lim itantes de registro.

‘Datagram socket’
P rovee m ensajes en flujo de dos vías. En un socket datagram a puede
recibir m ensajes en orden diferente de la secuencia de la cual fueron
enviados. Los lim ites de registro en los datos son preservados. Los
datagram a operan en form a sem ejante a cartas que van y vienen en el
correo. El tipo de socket es: SOCK_DGR A M , el cual, en el dom inio I nternet
usa el protocolo Datagram a (UDP ).

Socket paquete secuencial (sequential packet socket)


P rovee conexiones de dos vías, secuencial, confiable, para datagram as de
una longitud m áxim a fija. El tipo de socket es SOCK_SEQP A CKET. N o se
ha im plem entado un protocolo para esta fam ilia.
Práctica 18
Mayo 2018

Sockets crudos (raw socket)
P roveen acceso a los protocolos de com unicación subyacentes.

Los siguientes son códigos de program as servidor-cliente que usan


sockets para com unicarse en el m ism o sistem a.
a) Verifique que funcionan usando la dirección de ‘host local’ universal
(127.0.0.1) de internet, y posteriorm ente m odifíquelos para enviar
a través de éstos un archivo de tipo binario por parám etro:
P or ejem plo: #socket_srv <nom _arch>
b) Usando la orden ‘ipconfig getpacket enX’ (cam bie la X por 0, 1, … )
de m anera que localice la dirección hom ologada que dispone en su
equipo de cóm puto, m odifique los códigos para enviar por parám etro
un archivo de texto usando entre am bos program as una dirección
com ún.
c) A poyándose en órdenes Unix, reporte la secuencia de las órdenes
que fueron usadas y que se dem uestre que se logró la
transm isión/ recepción del archivo.

Programa servidor:

// http://www.cs.cf.ac.uk/Dave/C/node28.html (3 of 7) [25/03/2002 10:40:11]


// socket_serv.c
// programa socket servidor
//
// Created by Alberto Paz G on 29/05/17.
//
//
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#define NSTRS 3 /* No. de cadenas */
#define ADDRESS "127.0.0.1" /* direccion a conectarse */
/*
* Cadenas que se enviaran al cliente
*/
char *strs[NSTRS] = {
"Primera cadena desde el servidor.\n",
"Segunda cadena desde el servidor.\n",
"Tercera cadena desde el servidor.\n"
};
main()
{
char c;
FILE *fp;
int fromlen;
register int i, s, ns, len;
struct sockaddr_un saun, fsaun;
/*
* Obtenga un socket con el cual trabajar. Este estará en el
* dominio UNIX y sera un 'stream socket'
*/
Práctica 18
Mayo 2018

if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
perror("servidor: socket");
exit(1);
}
/*
* Crear la dirección a la que se conectará.
*/
saun.sun_family = AF_UNIX;
strcpy(saun.sun_path, ADDRESS);
/*
* Trate de ligar (bind) la direccion al socket. Primero
* desligamos (unlink) el nombre de manera que el enlace no falle
*
* El tercer argumento indica la 'longitud' de la estructura, no
* solo la longitud del nombre del socket.
*/
unlink(ADDRESS);
len = sizeof(saun.sun_family) + strlen(saun.sun_path);
if (bind(s, &saun, len) < 0) {
perror("servidor: bind");
exit(1);
}
/*
* Escucha en el socket
*/
if (listen(s, 5) < 0) {
perror("servidor: escucha");
exit(1);
}
/*
* Accepta conexiones: Cuando se acepta una, ns
* se conectará al cliente. fsaun contendra la
* direccion del cliente
*/
if ((ns = accept(s, &fsaun, &fromlen)) < 0) {
perror("servidor: acepta");
exit(1);
}
/*
* Usaremos 'stdio' para leer del socket
*/
fp = fdopen(ns, "r");
/*
* Primero enviamos algunas cadenas al cliente.
*/
for (i = 0; i < NSTRS; i++)
send(ns, strs[i], strlen(strs[i]), 0);
/*
* Ahora leemos algunas cadenas del cliente y las imprimimos
*/
for (i = 0; i < NSTRS; i++) {
while ((c = fgetc(fp)) != EOF) {
putchar(c);
if (c == '\n')
break;
Práctica 18
Mayo 2018

}
}
/*
* Simplemente usamos 'close()' para terminar la conexion
* puesto que hemos terminado en ambos extremos
*/
close(s);
exit(0);
}

Programa cliente:
// http://www.cs.cf.ac.uk/Dave/C/node28.html (3 of 7) [25/03/2002 10:40:11]
// socket_cl.c
// programa socket cliente
//
// Created by Alberto Paz G on 29/05/17.
//
//
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#define NSTRS 3 /* No. de cadenas */
#define ADDRESS "127.0.0.1" /* direccion a conectarse */
/*
* Cadenas que se enviaran al servidor
*/
char *strs[NSTRS] = {
"Primera cadena desde el cliente.\n",
"Segunda cadena desde el cliente.\n",
"Tercera cadena desde el cliente.\n"
};
main()
{
char c;
FILE *fp;
register int i, s, len;
struct sockaddr_un saun;
/*
* Obtenga un socket con el cual trabajar. Este estará en el
* dominio UNIX y sera un 'stream socket'
*/
if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
perror("cliente: socket");
exit(1);
}
/*
* Crear la dirección a la que se conectará.
*/
saun.sun_family = AF_UNIX;
strcpy(saun.sun_path, ADDRESS);
/*
Práctica 18
Mayo 2018

* Trate de connectarse a la direccion. Para lograrlo, el servidor
* debe ya haberse ligado a esta direccion y suministrado una
* requerimiento listen()
*
* El tercer argumento indica la 'longitud' de la estructura, no
* solo la longitud del nombre del socket.
*/
len = sizeof(saun.sun_family) + strlen(saun.sun_path);
if (connect(s, &saun, len) < 0) {
perror("cliente: conecta");
exit(1);
}
/*
* Usaremos 'stdio' para leer del socket
*/

fp = fdopen(s, "r");

/*
* Primero leemos algunas cadenas del servidor y las imprimimos
*/

for (i = 0; i < NSTRS; i++) {


while ((c = fgetc(fp)) != EOF) {
putchar(c);
if (c == '\n')
break;
}
}
/*
* Ahora enviamos algunas cadenas al servidor
*/

for (i = 0; i < NSTRS; i++)


send(s, strs[i], strlen(strs[i]), 0);
/*
* Simplemente usamos 'close()' para terminar la conexion
* puesto que hemos terminado en ambos extremos
*/
close(s);
exit(0);
}

S-ar putea să vă placă și