Codigo Fuente Cliente/Servidor en C

Anuncios

Aqui les dejo dos Ejemplos de Cliente/Servidor en lenguaje C.
Son de unas clases de la facu en la materia de sistemas distribuidos de ingenieria en informatica
- - - - - - - - - - - - - - - - - - - - - Ejemplo 1 - - - - - - - - - - - - - - - - - - - - -
Cliente 1
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>

#DEFINE PORT 3600
#DEFINE MAXDATASIZE 100

int main(int argc, char *argv[])
{
int fd, numbytes;
char buf[MAXDATASIZE];
struct hostent *he;
struck sockaddr_in server;

if (argc!=2)
{
printf("Usa:%<Direccion IP>n", argv[0];
esit(-1);
}

if (he=gethostbyname(argv[1]))==NULL)
{
printf("error en gethosbynamen" );
exit(-1);
}

if ((fd=socket(AF_INET, sock_stream,0)==-|)
{
printf("error en socketn" );
exit(-1);
}

server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr=*((struct in_addr*) he->h_addr);
bzero(&(server.sin_zero),0);

if (connect(fd,(struct sockaddr*)&server, sizeof(struct sockaddr))==-1)
{
printf("error en connectn" );
exit(-1);
}

if (numbytes=recv(fd,buf,MAXDATASIZE,0))==-1)
{
printf("error en recvn" );
exit(-1);
}

buf[numbytes]='0';
printf("Mensaje del servidor:%n",buf);
close(fd);

}



Servidor 1

#include<stdio.h>
#include<sys/tpes.h>
#incuude<sys/socket.h>
#include<netinet/in.h>

#DEFINE PORT 3500
#DEFINE BACKLOG 2
main()
{
int fd, fd2;
struct sockaddr_in server;
struct sockaddr_in client;
int sn_size;

if ((fd=socket(AF_INET, SOCK_STREAM, 0))==1)
{
printf ("Error en socketn" );
exit(-1);
}

server.sin_family = AF_INET;
server.sin_port=htons(PORT);
server.sinaddrs.s_addr=INADDR_ANY;
bzero(&(server.sin_zero),8);
if (bind(fd,(strut sockaddr *) &server, sizeof(struct sockaddr))== -1)
{
printf("Error en bindn" );
exit(-1)
}

if (listen(fd, BAKLOG) == -1)
{
printf("Error en listenn" );
exit(-1);
}

while (1)
{
sin_size = sizeof(struct sockaddr_in);

if ((fd2=accept(fd,(struct sockaddr *)&client, &sin_size)) == -1)
{
printf ("error en accept n" );
exit(-1);
}

printf("Se conectaron desde %sn", inet_ntoa(client.sin_addr));
send(fd2, "Bienvenido a mi servidor!!!n",26, 0);
close(fd2);
}

}






- - - - - - - - - - - - - - - - - - - - - Ejemplo 2 - - - - - - - - - - - - - - - - - - - - -

Cliente 2

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

/**********************************************************/
/* función MAIN */
/* Orden Parametros: IP destino, puerto , mensaje */
/* */
/**********************************************************/
main(int argc, char *argv[])
{
int s;
struct sockaddr_in bs,des;
char resp[255];
int *sd;

if (argc == 4)
{
// Creamos el socket
s = socket(AF_INET,SOCK_STREAM,0);

if (s != -1)
{
bs.sin_family = AF_INET;
bs.sin_port = htons(0); //Asigna un puerto disponible dela máquina
bs.sin_addr.s_addr = htonl(INADDR_ANY); //Asigna una IP de la máquina

//Asigna un nombre local al socket
if ( bind(s,(struct sockaddr*)&bs, sizeof(bs)) != -1)
{
//Se prepara el nombre de la máquina remota
des.sin_family = AF_INET;
des.sin_addr.s_addr = inet_addr(argv[1]);
des.sin_port = htons(atoi(argv[2]));

//Establece la conexión con la máquina remota
connect(s,(struct sockaddr*)&des,sizeof(des));

//Envía el mensaje
send(s,argv[3],strlen(argv[3])+1,0);
printf("nn->Enviando: %s, a: %s en el puerto: %s n",argv[3], argv[1], argv[2]);
//Recibe la respuesta
recv(s,resp, sizeof(resp) ,0);
printf("<-Recibido: %sn",resp);
//Se cierra la conexión (socket)
close(s);
}
else
{
printf("ERROR al nombrar el socketn" );
}
}
else
{
printf("ERROR: El socket no se ha creado correctamente!n" );
}

}
else
{
printf("nnaEl número de parámetros es incorrectonn" );
}
}


Servidor 2


#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
/**********************************************************/
/* función MAIN */
/* Orden Parametros: Puerto */
/* */
/**********************************************************/
main(int argc, char *argv[])
{
int s;
struct sockaddr_in bs, in;
char entrada[255];
int sd;
if (argc == 2)
{
// Creamos el socket
s = socket(AF_INET,SOCK_DGRAM,0);
if (s != -1)
{
bs.sin_family = AF_INET;
bs.sin_port = htons(atoi(argv[1])); //Asigna el puerto especificado por la línea de comandos
bs.sin_addr.s_addr = htonl(INADDR_ANY); //IP cualquiera de la máquina


//Asigna un nombre local al socket
if( bind(s,(struct sockaddr*)&bs, sizeof(bs)) != -1)
{
printf("naServidor ACTIVO escuchando en el puerto: %sn",argv[1]);
//El while permite atender a múltiples clientes
while (1)
{
//Recibe la cadena del cliente
if ( recvfrom(s,entrada, sizeof(entrada) ,0,(struct sockaddr*) &in, &sd)== -1)
perror("Error en recvfrom" );

//Devuelve la cadena al cliente
if (sendto(s,strcat(entrada, "" ; ) ,strlen(entrada)+1,0,(struct sockaddr*) &in, sizeof(in)) == -1)
perror("Error en sendto" );
}
//Se cierra el socket
close(s);
}
else
{
printf("ERROR al nombrar el socketn" );
}
}
else
{
printf("ERROR: El socket no se ha creado correctamente!n" );
}
}
else
{
printf("nnaEl número de parámetros es incorrectonn" );
}
}



Los codigos son basicos, pero espero que le sea de utilidad a alguien y si quieren compartir con mejoras en el codigo GENIAL para los que alguna vez necesiten!!

Anuncios

24 comentarios - Codigo Fuente Cliente/Servidor en C

superra
gracias che re piola!
Manu477
Podes subir el código fuente en un zip?
Si podes también adjuntame la libreria &quot;sys/socket.h&quot; que cuando instalas el visual studio 2008 no viene incluida. ¿Puede ser?
Gracias!
maxitnr
el codigo es para linux (lo digo para los q intenten compilarlo en windows no van a poder )
rcorrea11
Pa' mis clases de S.O. Muchas gracias.
oCovAo
tienen demasiados errores, mejor me hice uno nuevo en vez de copiar estas chingaderas
PZero21
Muy copado che +10
valerx1
y los pcs cliente servidor se conectan con un cable cruzado ?
y la dirección ip y mascara de subred y puerta de enlace no se tuvieron que establecer o configurar previamente
en el pc servidor a través de windows ? ha.....

o es solamente una simulación en un mismo computador ?.. Humm....
CasiqueCasimiro
La red entre pc ya debe de existir previamente. esto es administrado por el SO.

La libreria socket.h funciona mediante llamados al SO.
chusinho
Genial ojala funciones +10
fox180383
busca los errores si funciona no seas flojo los errores estan en las caritas que aparecen
oCovAo dijo:tienen demasiados errores, mejor me hice uno nuevo en vez de copiar estas chingaderas
xsunderx -1
lastima q es para linux
Khra
gracias por esto ty
dralnus
Te dejo mis 10 orale wey no mas.
urielnj
MUCHAS GRACIAS, APROBARLOS EN CYGWIN
Facu3332
No es para linux, en windows tenes que agregar la ws2_32.lib y compila!
natofe
¿tienes los fuentes sin errores,por favor?, es que quiero probarlo y como no sé me cuesta mucho arreglarlos.
Gracias.
natofe
aaahí le hice una pequeña modificación y me funciono:
SERVIDOR:
=========

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h> // para los avisos del exit();

#define PORT 3500
#define BACKLOG 2

void main(){
int fd, fd2;
struct sockaddr_in server;
struct sockaddr_in client;
int sin_size;

if ((fd=socket(AF_INET, SOCK_STREAM, 0))==1){
printf ("Error en socketn" );
exit(-1);
}

server.sin_family = AF_INET;
server.sin_port=htons(PORT);
server.sin_addr.s_addr=INADDR_ANY;



bzero( &(server.sin_zero) ,8);
if (bind(fd,(struct sockaddr *) &server, sizeof(struct sockaddr))== -1){
printf("Error en bindn" );
exit(-1);
}

if (listen(fd, BACKLOG) == -1){
printf("Error en listenn" );
exit(-1);
}


while (1){
sin_size = sizeof(struct sockaddr_in);

if ((fd2=accept(fd,(struct sockaddr *)&client, &sin_size)) == -1) {
printf ("error en accept n" );
exit(-1);
}

printf("Se conectaron desde %sn", inet_ntoa(client.sin_addr));
send(fd2, "Bienvenido a mi servidor!!!n",26, 0);
close(fd2);
}
}
CLIENTE:
=======

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

/* *********************************************************
función MAIN
Orden Parámetros: IP destino, puerto , mensaje
ejecutar: ./client 127.0.0.1 3500 hola
hola es el mensaje
******************************************************** */
main(int argc, char *argv[]){
int s;
struct sockaddr_in bs,des;
char resp[255];
int *sd; // este puntero aun no se para que es ¿?

if (argc == 4){
s = socket(AF_INET,SOCK_STREAM,0); // Creamos el socket
if (s != -1){
bs.sin_family = AF_INET; //Asigna un puerto disponible dela máquina
bs.sin_port = htons(0); //Asigna una IP de la máquina
bs.sin_addr.s_addr = htonl(INADDR_ANY); //Asigna un nombre local al socket
if ( bind(s,(struct sockaddr*)&bs, sizeof(bs)) != -1){
des.sin_family = AF_INET; //Se prepara el nombre de la máquina remota
des.sin_addr.s_addr = inet_addr(argv[1]);
des.sin_port = htons(atoi(argv[2]));
connect(s,(struct sockaddr*)&des,sizeof(des)); //Establece la conexión con la máquina remota
send(s,argv[3],strlen(argv[3])+1,0); //Envía el mensaje
printf("nn->Enviando: %s, a: %s en el puerto: %s n",argv[3], argv[1], argv[2]);
recv(s,resp, sizeof(resp) ,0); //Recibe la respuesta
printf("<-Recibido: %sn",resp);
close(s); //Se cierra la conexión (socket)
}
else{ printf("ERROR al nombrar el socketn" ); }
}else{ printf("ERROR: El socket no se ha creado correctamente!n" ); }
}else{ printf("nnEl número de parámetros es incorrectonn" ); }
}

Saludos
iGeraNazgul
Oigan tal vez mi duda sea un poco tonta pero al querer conectarlos pero en maquinas distintas no funcionan, nunca conectan.... por ejemplo Cliente2 y Servidor2, es decir el servidor en mi máquina lo levanto y el cliente en otra con la ip de mi maquina y nada mas nel, ¿alguna ayuda?...Gracias
Devorad
Como seria, para que el cliente genere un numero aleatorio y lo mande al servidor, en el ejemplo 2(cliente 2)?
Knikni
El puto amo. Aqui tienes mi 10 porque 20 no puedo.
alsuga1
suba eso a github o algun repositorio, quedaria mejor gran aporte
yomoxer1
Gracias me sirvió de mucho para mi clase de S.O
yofer88
como lo ejecuto estando en la misma pc? Saludos