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!!