[C con Clase] ayuda con socket
Leonel Florin Selles
leonel06033 en cfg.jovenclub.cu
Vie Nov 26 17:11:40 CET 2010
Gracias amigo, ya arregle el problema, tenia una condición mal puesta, a
la hora de verificar si el valor devuelto por la función que utilizo para
leer datos era el correo, y al final le pregunte si los byte leeidos son
== 0 entonces es que ya no esta mandando nada y hago algo para resolver
eso.
saludos, gracias de todas maneras.
> podrías mostrar el codigo.
>
> Yo recientemente tuve que trabajar con sockets pero al final el servidor
> concurrente lo implemente con hebras.
>
> Por lo que leo de la descripci? de tu problema es que:
>
> - el servidor esta imprimiendo varias veces lo que llego desde el cliente,
> por lo que deberías revisar el bucle que recibe los mensajes o como es que
> implementaste select
>
> -Es cliente envia repetitivamente el mensaje o texto, Igualmente revisa el
> blucle que envia. Alternativamente puedes usar telnet para probar que no
> sea
> el cliente el problema:
>
> telnet localhost 'port' <--- y probar
>
> Pillé este código que implementa un servidor con select. Espero que te
> sirva
>
> /*
> NAME: TCPServer
> SYNOPSIS: TCPServer [Port_number]
> DESCRIPTION: The program creates a TCP socket in the inet
> listen for connections from TCPClients, accept
> clients into private sockets. It uses select to attend
> clients' requests as they come.
>
> */
>
> #include <stdio.h>
> #include <errno.h>
> #include <sys/time.h>
>
> #include <sys/param.h>
> #include <sys/socket.h>
> #include <sys/file.h>
>
> #include <netinet/in_systm.h>
> #include <netinet/in.h>
> #include <netinet/ip.h>
> #include <netinet/ip_icmp.h>
> #include <netdb.h>
>
>
> #define MAXHOSTNAME 80
> void reusePort(int sock);
>
> main( argc, argv )
> int argc;
> char *argv[];
> {
> int s, ss;
> struct sockaddr_in server;
> struct sockaddr_in from;
> int fromlen;
> int length;
>
> fd_set readfds, readfdsCopy;
> int n,i;
> int sockList[64], lastSock=0;
>
>
> /* Construct name of socket to send to. */
> server.sin_family = AF_INET;
> server.sin_addr.s_addr = htonl(INADDR_ANY);
> if (argc == 2)
> server.sin_port = htons(atoi(argv[1]));
> else
> server.sin_port = htons(0);
>
> s = socket (AF_INET,SOCK_STREAM,0);
> reusePort(s);
>
> if ( bind( s, (struct sockaddr *)&server, sizeof(server) ) ) {
> close(s);
> perror("binding name to stream socket");
> exit(-1);
> }
>
> length = sizeof(server);
> if ( getsockname (s, (struct sockaddr *)&server,&length) ) {
> perror("getting socket name");
> exit(0);
> }
>
> printf("Server Port is: %d\n", ntohs(server.sin_port));
>
> listen(s,4);
> fromlen = sizeof(from);
> FD_ZERO(&readfdsCopy);
> FD_SET(s,&readfdsCopy);
>
> for(;;){
> memcpy(&readfds, &readfdsCopy, sizeof(fd_set));
> n = select(FD_SETSIZE, &readfds, (fd_set *) 0, (fd_set *) 0, NULL);
> if (n > 0) {
> if (FD_ISSET(s, &readfds)) {
> printf("Accepting a new connection...\n");
> sockList[lastSock++] = accept(s, (struct sockaddr *)&from,
> &fromlen);
> FD_SET(sockList[lastSock-1], &readfdsCopy);
> }
> for (i=0; i < lastSock; i++) {
> if (FD_ISSET(sockList[i], &readfds))
> if (EchoServe(sockList[i]) < 0) {
> FD_CLR(sockList[i], &readfdsCopy);
> close (sockList[i]);
> sockList[i] = sockList[--lastSock];
> i--;
> printf("Number of current clients: %d\n", lastSock);
> }
> }
> }
> }
> }
> int EchoServe(int psd)
> {
> char buf[512];
> int rc;
>
> /* get data from clients and send it back */
> for(;;){
> printf("\n...server is waiting...\n");
> if( (rc=read(psd, buf, sizeof(buf))) < 0)
> perror("receiving stream message");
> if (rc > 0){
> buf[rc]='\0';
> printf("Received: %s\n", buf);
> if (send(psd, buf, rc, 0) <0 )
> perror("sending stream message");
> return(1);
> }
> else {
> printf("Disconnected..\n");
> return(-1);
> }
> }
> }
> void reusePort(int s)
> {
> int one=1;
>
> if ( setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *) &one,sizeof(one)) ==
> -1 )
> {
> printf("error in setsockopt,SO_REUSEPORT \n");
> exit(-1);
> }
> }
>
>
>
>
> 2010/11/24 Leonel Florin Selles <leonel06033 en cfg.jovenclub.cu>
>
>> Hola amigos:
>>
>> Bueno, quiero hacer dos programas que se ejecuten en la misma pc y que
>> se
>> comuniquen entre ellos a través de socket tipo UNIX o el sinónimo
>> (local)(PF_UNIX) (PF_LOCAL) y a la misma vez estoy utilizando la función
>> select, todo me trabaja perfecto, pero cuando el cliente manda datos al
>> servidor la función select lo detecta una y otra vez como que el cliente
>> esta mandando datos una y otra vez, pero es que el envío de esos datos
>> solo los hago una vez, será que estas funciones no trabajan bien con
>> sockets de tipo UNIX o LOCAL.
>>
>> Saludos, alguna sugerencia.
>>
>>
>> _______________________________________________
>> Lista de correo Cconclase Cconclase en listas.conclase.net
>> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
>> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Más información sobre la lista de distribución Cconclase