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);
}
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
0