elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  duda sockets no bloqueantes+stdin
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: duda sockets no bloqueantes+stdin  (Leído 2,661 veces)
nosoqui

Desconectado Desconectado

Mensajes: 18


Ver Perfil
duda sockets no bloqueantes+stdin
« en: 4 Septiembre 2011, 23:17 pm »

Tengo el siguiente problema.... el programa deja pasar un lapso de tiempo y mira si hay algo para leer, tanto en un socket(una conexión), como en la entrada estandar(con la llamada select() ), pero el problema es que cuando recibo del socket algo, el programa ya no es capaz de leer nada de la entrada estandar, es como si el socket bloqueara la entrada o algo. La parte del codigo conflictiva sería algo como sígue:
*Asumimos que la conexión está manejada por el descriptor newcon

Código:

while(1)
{
FD_ZERO(&fds);
FD_SET(newcon,&fds);
FD_SET(STDIN_FILENO,&fds);
select(newcon+1,&fds,NULL,NULL,&intervalo);

if(FD_ISSET(newcon,&fds))
{
 while(((sizerec=recv(newcon,buffer,BUFFERSIZE,0))>0)
  fwrite(buffer,sizeof(char),sizerec,stdout);
}
if(FD_ISSET(STDIN_FILENO,&fds))
{
scanf("%[^\n]s",envbuffer); // asumimos un buffer muy grande
send(newcon,envbuffer,strlen(envbuffer),0);
}


}


Saludos y gracias


En línea

nosoqui

Desconectado Desconectado

Mensajes: 18


Ver Perfil
Re: duda sockets no bloqueantes+stdin
« Respuesta #1 en: 5 Septiembre 2011, 14:24 pm »

Pongo un código de ejemplo, por si alguien  puede ayudarme, viendo el error  por si mismo:

Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/time.h>
#define PUERTO 12345

int main()
{
int sockfd,newcon;
struct sockaddr_in cliaddr,seraddr;
struct timeval intervalo;
fd_set fds;
int cliaddrsize;
int recsize;
char recibo[100];
char escribo[100];

intervalo.tv_sec=0; intervalo.tv_usec=100;
bzero(&seraddr,sizeof(struct sockaddr_in));
bzero(&cliaddr,sizeof(struct sockaddr_in));
seraddr.sin_family=AF_INET;
seraddr.sin_port=htons(PUERTO);
seraddr.sin_addr.s_addr=INADDR_ANY;
sockfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(bind(sockfd,(struct sockaddr  *) &seraddr,sizeof(struct sockaddr)) | listen(sockfd,20)) { printf("Error bindeando\n"); exit(-1); }
fcntl(sockfd,F_SETFL,O_NONBLOCK);
while(1)
{
newcon=accept(sockfd,(struct sockaddr *) &cliaddr, &cliaddrsize);
if(newcon!=-1)
{
printf("Tenemos a  este pedazo de cabron conectado a nuestro sistema: \n ip: %s\npuerto: %hu\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
if(fork()==0)
{
while(1)
{
FD_ZERO(&fds);
FD_SET(newcon,&fds);
FD_SET(0,&fds);
select(newcon+1,&fds,NULL,NULL,&intervalo);
if(FD_ISSET(newcon,&fds))
{ while((recsize=recv(newcon,recibo,100,0))>0) fwrite(recibo,sizeof(char),recsize,stdout); }
if(FD_ISSET(0,&fds)) { scanf("%[^\n]s",escribo); send(newcon,escribo,strlen(escribo),0); }

}

}

}

}

return 0;
}



En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda - Sockets
Programación Visual Basic
xtermsh 2 2,176 Último mensaje 3 Enero 2010, 18:05 pm
por xtermsh
[Duda] Sockets Sincronizados
Java
Amerikano|Cls 0 2,220 Último mensaje 23 Enero 2010, 22:19 pm
por Amerikano|Cls
duda con gethostbyname sockets
Programación C/C++
dkmarley 3 4,148 Último mensaje 6 Septiembre 2010, 01:51 am
por dkmarley
[Duda]Sockets en perl.
Scripting
volteo0101 5 4,035 Último mensaje 14 Enero 2011, 05:07 am
por volteo0101
[C] Limpiando la stdin correctamente...
Programación C/C++
zShackra 9 4,920 Último mensaje 12 Noviembre 2014, 20:44 pm
por zShackra
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines