Gracias por vuestras respuestas, estoy ya hecho un lio, os pongo los sources:
Esta es la librería ss.c:
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <strings.h>
#include "ss.h"
/* El número máximo de datos en bytes */
int fd, fd_client, fd_server;
int client(char ip[25], int port)
{
/* ficheros descriptores */
char buf[MAXDATASIZE];
/* en donde es almacenará el texto recibido */
struct hostent *he;
/* estructura que recibirá información sobre el nodo remoto */
struct sockaddr_in server;
/* información sobre la dirección del servidor */
if ((he=gethostbyname(ip))==NULL){
/* llamada a gethostbyname() */
printf("gethostbyname() error\n"); return(1);
}
if ((fd=socket(AF_INET, SOCK_STREAM, 0))==-1){
/* llamada a socket() */
return(1);
}
server.sin_family = AF_INET;
server.sin_port = htons(port);
/* htons() es necesaria nuevamente ;-o */
server.sin_addr = *((struct in_addr *)he->h_addr);
/*he->h_addr pasa la información de ``*he'' a "h_addr" */
bzero(&(server.sin_zero),8);
if(connect(fd, (struct sockaddr *)&server,
sizeof(struct sockaddr))==-1){
/* llamada a connect() */
return(1);
}
return(0);
}
int server(int port) {
struct sockaddr_in server;
/* para la información de la dirección del servidor */
struct sockaddr_in client;
/* para la información de la dirección del cliente */
int sin_size;
/* A continuación la llamada a socket() */
if ((fd_server=socket(AF_INET, SOCK_STREAM, 0)) == -1 ) {
printf("error en socket()\n"); return(1);
}
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = INADDR_ANY;
/* INADDR_ANY coloca nuestra dirección IP automáticamente */
bzero(&(server.sin_zero),8);
/* escribimos ceros en el reto de la estructura */
/* A continuación la llamada a bind() */
if(bind(fd_server,(struct sockaddr*)&server,
sizeof(struct sockaddr))==-1) {
return(1);
}
if(listen(fd_server,2) == -1) { /* llamada a listen() */
printf("error en listen()\n"); return(1);
}
sin_size=sizeof(struct sockaddr_in);
/* A continuación la llamada a accept() */
if ((fd_client = accept(fd_server,(struct sockaddr *)&client,
&sin_size))==-1) {
printf("error en accept()\n"); return(1);
}
return(0);
}
Estos sus headers en un fichero .h:
#define MAXDATASIZE 100
extern int fd;
extern int fd_client;
extern int fd_server;
int client(char[], int);
int server(int);
Este es el server:
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <strings.h>
#include "ss.h"
int fd_client;
int fd_server;
void main() {
if((server
(3550))==1) printf("hubo un fallo abriendo el socket");
while(1) send(fd_client, "hola", 100, 0);
close(fd_client);
}
Y este el cliente:
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <strings.h>
#include "ss.h"
void main() {
int fd;
char buf[100];
int numbytes;
if((client
("localhost", 3550))==1) printf("hubo un fallo abriendo el socket"); while(1){
if((numbytes
=recv
(fd
,buf
,100,0))==-1) printf("error recv");
buf[numbytes]='\0';
}
close(fd);
}
Saludos.