Bueno, no es bien bien en un chat, hablando claro y simplificando, es solo una aplicacion de servidor<->cliente, los cuales pueden enviarse datos sin esperar a recibir ni a leer de teclado(Para ello tuve que usar los flags de no bloqueante para los descriptores, tanto del socket como de la entrada standart(teclado). El modo en que lo he hecho es algo extraño, y no creo que sea el mas adecuado, ya que si no ocurre nada, el bucle se ejecuta muchisimas veces y no se hasta que punto es bueno eso, pero bien, les muestro el codigo de servidor.c y cliente.c y a ver si me echan un cable.
Servidor.c#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <fcntl.h>
#define PORT 3222
#define MAX 100
int
main(int argc, char **argv)
{
struct sockaddr_in servidor,cliente;
int fd,fd2,sin_size,nbytes,flags;
char buffer[MAX],buf[MAX];
if((fd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket->");
exit(-1);
}
servidor.sin_family=AF_INET;
servidor.sin_port=htons(PORT);
servidor.sin_addr.s_addr=INADDR_ANY;
memset(&(servidor.sin_zero),' ',8);
if((bind(fd,(struct sockaddr *)&servidor,sizeof(struct sockaddr)))==-1)
{
perror("bind");
exit(-1);
}
if((listen(fd,2))==-1)
{
perror("listen");
exit(-1);
}
sin_size=sizeof(struct sockaddr_in);
if((fd2=accept(fd,(struct sockaddr *)&cliente,&sin_size))==-1)
{
perror("accept");
exit(-1);
}
if(flags=fcntl(fd2,F_GETFL,0)==-1)
{
perror("cuidado!");
exit(-1);
}
flags |=O_NONBLOCK;
if(fcntl(fd2,F_SETFL,flags)==-1)
{
perror("2flags");
exit(-1);
}
if(flags=fcntl(0,F_GETFL,0)==-1)
{
perror("cuidado!");
exit(-1);
}
flags |=O_NONBLOCK;
if(fcntl(0,F_SETFL,flags)==-1)
{
perror("2flags");
exit(-1);
}
printf("Cliente conectado: %s\n",inet_ntoa(cliente.sin_addr));
while(1)
{
if((nbytes=recv(fd2,buffer,100,0))>0)
{
buffer[nbytes]=0;
printf("Buffer->%s",buffer);
}
//printf("Server enmedio\n");
memset(buffer,sizeof(buffer),0);
if((nbytes=read(0,buffer,MAX-1))>0)
{
buffer[nbytes]=0;
send(fd2,buffer,nbytes,0);
}
}
close(fd2);
close(fd);
}
Cliente.c#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <fcntl.h>
#define PORT 3222
#define MAX 100
int
main(int argc, char **argv)
{
struct hostent *server_info;
struct sockaddr_in server;
int fd,numbytes,flags;
char buf[200];
if((server_info=gethostbyname(argv[1]))==NULL)
{
perror("gethost");
exit(-1);
}
if((fd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(-1);
}
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr=*((struct in_addr *)server_info->h_addr);
memset(&(server.sin_zero),' ',8);
if((connect(fd,(struct sockaddr *)&server,sizeof(struct sockaddr)))==-1)
{
perror("socket");
exit(-1);
}
if(flags=fcntl(fd,F_GETFL,0)==-1)
{
perror("cuidado!");
exit(-1);
}
flags |=O_NONBLOCK;
if(fcntl(fd,F_SETFL,flags)==-1)
{
perror("2flags");
exit(-1);
}
if(flags=fcntl(0,F_GETFL,0)==-1)
{
perror("cuidado!");
exit(-1);
}
flags |=O_NONBLOCK;
if(fcntl(0,F_SETFL,flags)==-1)
{
perror("2flags");
exit(-1);
}
while(1)
{
if((numbytes=read(0,buf,8))>0)
{
printf("Leyendo del teclado\n");
buf[numbytes]=0;
send(fd,buf,numbytes,0);
memset(buf,sizeof(buf)-1,0);
}
if((recv(fd,buf,20,0))>0)
{
printf("Recibiendo!\n");
buf[strlen(buf)-1]=0;
printf("Buffer->%s\n",buf);
}
}
close(fd);
return 0;
}
Hasta aqui todo, gracias de antemano