SOCKETS
SOCKETS
SOCKETS
JUÁREZ
Sistemas Distribuidos
SOCKETS Y MEMORIA COMPARTIDA
15 de Noviembre de 2011
SOCKETS
//SERVIDOR
/* Programa con sockets que comprueba si un número es primo o no*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <stdio.h>
if (argc < 2) {
fprintf(stderr,"ERROR, no port provided\n");
exit(1);
}
//La función bzero() pone a cero los n primeros bytes de la cadena de bytes
//La función sizeof retorna al tamaño en bytes de unelemento del tipo
//recibido como argumento
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
clilen = sizeof(cli_addr);
//*************************************************
// recibe 5 "numeros" pero cont debe ser menor que 10 y no que 5
// por aquello de los espacios en blanco al final de la cadena
for (cont=0;cont<10;cont++){
bzero(buffer,256);
num=atoi (buffer);
vector[cont]=num;
if (c*c>vector[cont]) {
printf("\nEl número %d es primo\n",vector[cont]);
cont++;
}
return 0;
}
SOCKETS
//CLIENTE
/* Programa con sockets que lee 5 números y comprueba si son primos o no*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdlib.h>
#include <stdio.h>
server = gethostbyname(argv[1]);
if (server == NULL) {
fprintf(stderr,"ERROR, no such host\n");
exit(0);
}
//La función bzero() pone a cero los n primeros bytes de la cadena de bytes
//La función sizeof retorna al tamaño en bytes de unelemento del tipo
//recibido como argumento
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(portno);
if (connect(sockfd, (struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0)
error("ERROR connecting");
bzero(buffer,256);
fgets(buffer,255,stdin); //lee de teclado
//******************************************
printf("Please enter number %d: ",cont=cont++);
bzero(buffer,256);
fgets(buffer,255,stdin);
n = write(sockfd,buffer,strlen(buffer));
if (n < 0)
error("ERROR writing to socket");
//******************************************
printf("Please enter number %d: ",cont=cont++);
bzero(buffer,256);
fgets(buffer,255,stdin);
n = write(sockfd,buffer,strlen(buffer));
if (n < 0)
error("ERROR writing to socket");
//******************************************
printf("Please enter number %d: ",cont=cont++);
bzero(buffer,256);
fgets(buffer,255,stdin);
n = write(sockfd,buffer,strlen(buffer));
if (n < 0)
error("ERROR writing to socket");
//******************************************
printf("Please enter number %d: ",cont=cont++);
bzero(buffer,256);
fgets(buffer,255,stdin);
n = write(sockfd,buffer,strlen(buffer));
if (n < 0)
error("ERROR writing to socket");
n = read(sockfd,buffer,255);
if (n < 0)
error("ERROR reading from socket");
printf("%s\n",buffer);
//********************************************
bzero(buffer,256);
n = read(sockfd,buffer,255);
if (n < 0)
error("ERROR reading from socket");
printf("%s\n",buffer);
//********************************************
bzero(buffer,256);
n = read(sockfd,buffer,255);
if (n < 0)
error("ERROR reading from socket");
printf("%s\n",buffer);
//********************************************
bzero(buffer,256);
n = read(sockfd,buffer,255);// lee lo que le envia el servidor
if (n < 0)
error("ERROR reading from socket");
//********************************************
bzero(buffer,256);
n = read(sockfd,buffer,255);
if (n < 0)
error("ERROR reading from socket");
printf("%s\n",buffer);
//********************************************
bzero(buffer,256);
n = read(sockfd,buffer,255);
if (n < 0)
error("ERROR reading from socket");
printf("%s\n",buffer);
return 0;
}
SOCKETS
Este programa lee 5 entradas desde teclado en el lado del cliente, cada una de
estas entradas va a representar a un número. Los datos son enviados al servidor
que a su vez los convertirá de cadena de caracteres a números. Después se
harán los cálculos para saber si el número leído es un número primo o no.
También muestra del lado del servidor, en caso de no ser primo, de qué número
es múltiplo el dato leído. Al final para pasar de nueva cuenta los números pero
ahora del servidor al cliente, se utilizan algunas funciones para el manejo de
cadenas con el fin de concatenar los números con texto y enviarle cadenas al
cliente para que pueda imprimirlas (único método encontrado que se adaptaba al
entorno Linux).
//Moneda1
#include <stdio.h> //biblioteca estandar e/s
#include <stdlib.h>
#include <sys/types.h> //solicitar recursos como memoria compartida
#include <sys/ipc.h> // para semaforos, mensajes y memoria compartida
#include <sys/shm.h> //para shmid_ds
struct info{
float cantidad;
char tipo;
};
int main()
{
int id;
char p,d;
struct info *moneda;
struct shmid_ds shmbuf; //shmid_ds define una region de memoria
compartida
id = shmget(KEY, SEGSIZE, 0);
moneda = (struct info*) shmat(id,0,0);
printf ("Conversor Peso/Dolar Dolar/Peso.");
do {
printf ("\nIngrese tipo de moneda a convertir [P=peso][D=dolar][S=Salir]: \
n");
scanf ("%s",&moneda->tipo);
if (moneda->tipo=='p'|moneda->tipo=='P'|moneda->tipo=='d'|moneda-
>tipo=='D'){
printf ("\nIngrese la cantidad a convertir [0 para salir]: \n");
scanf ("%f", &moneda->cantidad);
}
printf("\nPrograma finalizado\n");
}
MEMORIA COMPARTIDA
// Moneda2
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
struct info{
float cantidad;
char tipo;
};
int main()
{
int i, id;
float vdolar;
struct info *moneda;
struct shmid_ds shmbuf;
id = shmget(KEY, SEGSIZE, IPC_CREAT | 0666); //crea espacio en memoria
si KEY no existe
moneda = (struct info*) shmat(id,0,0);
moneda->cantidad = 0;
vdolar=0;
do {
printf ("Esperando datos para procesar.\n" );
getchar();
if (moneda->tipo=='p'|moneda->tipo=='P'|moneda->tipo=='d'|moneda-
>tipo=='D'){
getchar();
printf ("Ingrese valor del dolar: \n");
scanf ("%f",&vdolar);
if(vdolar>0){
if(moneda->tipo=='d'|moneda->tipo=='D'){
printf ("La cantidad es: %.2f",moneda->cantidad*vdolar );
printf (" pesos.\n");
moneda->cantidad=moneda->cantidad*vdolar;
}
else {
printf ("La cantidad es %.2f", moneda->cantidad/vdolar);
printf (" dolares.\n");
moneda->cantidad=moneda->cantidad/vdolar;
}
}
else{
printf("\nValor de dolar invalido!");
}
}
} while (moneda->cantidad > 0);
printf("\nPrograma finalizado\n");
return EXIT_SUCCESS;
}
MEMORIA COMPARTIDA