C/Visual C - Programación con sockets en C (Linux)

 
Vista:

Programación con sockets en C (Linux)

Publicado por jmgc1982 (1 intervención) el 25/02/2011 09:06:15
Buenas a todos,

Estoy realizando un programa cliente - servidor mediante sockets en C que en la parte servidor me genera un numero aleatorio entre 1 y 100 y los clientes le van escribiendo numero y el server comprueba si es mayor, menor o han acertado... Todo sobre linux (ubuntu).

Ya lo tengo hecho y funcionando en local (IP: 127.0.0.1) para ejecutar primero un terminal el servidor, y después ejecutar un cliente y probar que el servidor contesta a las peticiones del cliente y funciona correctamente.

Lo único que me falta es que tengo que implantar el servidor corriendo en una máquina física con una IP, y después en 2 ordenadores más como ejecutar clientes , que le vayan enviando peticiones.

Además cuando alguien acierta el numero, que el server se quede escuchando, y que algun cliente tenga la posibilidad de enviar una señal al server para poder crear una nueva partida.

IDEAS???

Aqui os dejo el codigo fuente del servidor y cliente en C:

//Cliente.c

/* Make the necessary includes and set up the variables. */

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
int sockfd;
int len;
struct sockaddr_in address;
int result;
char numero;
char respuesta ='1'; //Inicializamos a 1 para que entre en el while

/* We can now read/write via sockfd. */

while(respuesta != '0')
{

printf("Escribe un número entre 1 y 100: ");
scanf("%s",&numero); //Para capturar caracteres utiliza "%s"

/* Create a socket for the client. */

sockfd = socket(AF_INET, SOCK_STREAM, 0);

/* Name the socket, as agreed with the server. */

address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_port = htons(9734);
len = sizeof(address);

/* Now connect our socket to the server's socket. */

result = connect(sockfd, (struct sockaddr *)&address, len);

if(result == -1) {
perror("oops: client3");
exit(1);
}

write(sockfd, &numero, 1);
//printf("El cliente envia: %c\n",numero);
read(sockfd, &respuesta, 1);
//printf("El cliente recibe: %c\n",respuesta);

if (respuesta == '1')
{
printf("El número es mayor que %c\n", numero);
}

if (respuesta == '2')
{
printf("El número es menor que %c\n", numero);
}
close(sockfd);
}

printf("Has acertado!!! %c era el número!!!\n", numero);
exit(0);
}

//Servidor.c

/* Make the necessary includes and set up the variables. */

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <math.h> //per us de atoi

int main()
{
int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;

/* Remove any old socket and create an unnamed socket for the server. */

server_sockfd = socket(AF_INET, SOCK_STREAM, 0);

/* Name the socket. */

server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(9734);
server_len = sizeof(server_address);
bind(server_sockfd, (struct sockaddr *)&server_address, server_len);

/* Create a connection queue and wait for clients. */

int aleatorio;
aleatorio = (1+rand()%100); //(1+rand()%100)
//aleatorio = 7;

listen(server_sockfd, 5); //Punto A
while(1)
{
char numero;
char respuesta;

printf("Servidor esperando peticiones...\n");

/* Accept a connection. */

client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address, &client_len);

/* We can now read/write to client on client_sockfd. */

read(client_sockfd, &numero, 1); //1 un numero de 1 cifra, 2 de 2 cifras
//printf("Server ha rebut: %c\n",numero);

//Código comparación
int numeroacomp = atoi(&numero); //atoi es Ascii To Integer
//printf("El numero a comparar es %d\n",aleatorio);


if(aleatorio > numeroacomp)
{
respuesta = '1'; //Si retorna 1 es que el valor es menor al número del cliente
}else{
if(aleatorio < numeroacomp)
{
respuesta = '2'; //Si retorna 2 es que el valor es mayor al número del cliente
}else{
respuesta = '0'; //Si retorna 0 es que el valor es el correcto.
}
}

//printf("Respuesta servidor: %c\n",respuesta);
write(client_sockfd, &respuesta, 1);

//Cerramos el Socket
close(client_sockfd);
}
exit(0);
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder