14/02/2011, 12:55
|
| | Fecha de Ingreso: febrero-2011
Mensajes: 2
Antigüedad: 13 años, 10 meses Puntos: 0 | |
Respuesta: Aplicacion Cliente-Servidor Te dejo el codigo servidor y el cliente. Lo que tengo q hacer es que el servidor sea concurrente y pueda atender varios clientes a la vez. (tengo entendido q habria q hacerlo con fork() o select() pero ni idea como)...
Servidor:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#define P_SIZE sizeof ( struct protocolo )
struct protocolo {
int64_t n1;
int64_t n2;
int64_t res;
};
int main()
{
int n;
int sd;
int sdc;
int lon;
int pid;
int salir;
int leidos;
char buffer[P_SIZE];
char pantalla[512];
struct sockaddr_in servidor;
struct sockaddr_in cliente;
struct protocolo *suma;
servidor.sin_family = AF_INET;
servidor.sin_port = htons(4444);
servidor.sin_addr.s_addr = INADDR_ANY;
sd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (bind(sd, (struct sockaddr *) &servidor, sizeof(servidor)) < 0) {
perror("BIND");
exit(-1);
}
listen(sd, 5);
suma = (struct protocolo *) buffer;
while (1) {
lon = sizeof (cliente);
sdc = accept(sd, (struct sockaddr *) &cliente, &lon);
salir = 0;
printf("Se obtuvo una conexion desde %s\n", //imprime la IP del cliente conectado
inet_ntoa(cliente.sin_addr) );
printf("Ingrese el valor de inicio: "); //Se ingresan los valores de inicio y de fin para sumar
fgets(pantalla, sizeof(pantalla), stdin);
pantalla[strlen(pantalla) -1 ] = '\0';
suma->n1 = htonl(atoi(pantalla));
printf("Ingrese segundo valor: ");
fgets(pantalla, sizeof(pantalla), stdin);
pantalla[strlen(pantalla) -1] = '\0';
suma->n2 = htonl(atoi(pantalla));
send(sdc, buffer, P_SIZE, 0);
close(sdc);
break;
}
}
CLIENTE:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#define P_SIZE sizeof ( struct protocolo )
/****************** FUNCIONES ********************/
int calcular_suma(int inicio, int fin);
/*************************************************/
struct protocolo {
uint64_t n1;
uint64_t n2;
uint64_t res;
};
int main(int argc, char *argv[])
{
int numbytes;
int n,i;
int sd,sdc;
int lon;
int leidos;
int inicio;
int fin;
unsigned long long int total=0;
char buffer[P_SIZE];
char pantalla[512];
struct sockaddr_in servidor;
struct protocolo *suma;
struct hostent *h;
if (argc < 2) {
printf("Ejecute %s (nombre del servidor)\n", argv[0]);
exit(-1);
}
servidor.sin_family = AF_INET;
servidor.sin_port = htons(4444);
if (h = gethostbyname(argv[1])) {
memcpy(&servidor.sin_addr, h->h_addr, h->h_length);
} else {
printf("No se encontro %s \n", argv[1]);
exit(-1);
}
sd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (connect(sd, (struct sockaddr *) &servidor, sizeof(servidor)) < 0) {
perror("Connect:");
exit(-1);
}
while (1) {
suma = (struct protocolo *) buffer;
n = recv(sd, buffer,P_SIZE, 0);
inicio=ntohl(suma->n1);
fin=ntohl(suma->n2);
printf("Esta terminal sumara desde el numero: %d al numero: %d \n", inicio, fin);
total=calcular_suma(inicio,fin);
printf("La suma total devuelta por esta terminal es: %llu \n", total);
break;
}
}
int calcular_suma(int inicio, int fin)
{
unsigned long long int suma=0;
while (inicio<=fin) {
suma=suma + inicio;
inicio++;
}
return suma;
} |