Autor
|
Tema: duda sockets no bloqueantes+stdin (Leído 2,826 veces)
|
nosoqui
Desconectado
Mensajes: 18
|
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 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
Mensajes: 18
|
Pongo un código de ejemplo, por si alguien puede ayudarme, viendo el error por si mismo: #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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Duda - Sockets
Programación Visual Basic
|
xtermsh
|
2
|
2,315
|
3 Enero 2010, 18:05 pm
por xtermsh
|
|
|
[Duda] Sockets Sincronizados
Java
|
Amerikano|Cls
|
0
|
2,307
|
23 Enero 2010, 22:19 pm
por Amerikano|Cls
|
|
|
duda con gethostbyname sockets
Programación C/C++
|
dkmarley
|
3
|
4,363
|
6 Septiembre 2010, 01:51 am
por dkmarley
|
|
|
[Duda]Sockets en perl.
Scripting
|
volteo0101
|
5
|
4,255
|
14 Enero 2011, 05:07 am
por volteo0101
|
|
|
[C] Limpiando la stdin correctamente...
Programación C/C++
|
zShackra
|
9
|
5,245
|
12 Noviembre 2014, 20:44 pm
por zShackra
|
|