podrías mostrar el codigo.<br><br>Yo recientemente tuve que trabajar con sockets pero al final el servidor concurrente lo implemente con hebras.<br><br>Por lo que leo de la descripciń de tu problema es que:<br><br>- 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<br>
<br>-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:<br> <br> telnet localhost 'port' <--- y probar<br>
<br>Pillé este código que implementa un servidor con select. Espero que te sirva<br><pre>/*<br>NAME: TCPServer<br>SYNOPSIS: TCPServer [Port_number]<br>DESCRIPTION: The program creates a TCP socket in the inet <br>
listen for connections from TCPClients, accept<br> clients into private sockets. It uses select to attend<br> clients' requests as they come.<br><br>*/<br><br>#include <stdio.h><br>
#include <errno.h><br>#include <sys/time.h><br><br>#include <sys/param.h><br>#include <sys/socket.h><br>#include <sys/file.h><br><br>#include <netinet/in_systm.h><br>#include <netinet/in.h><br>
#include <netinet/ip.h><br>#include <netinet/ip_icmp.h><br>#include <netdb.h><br><br><br>#define MAXHOSTNAME 80<br>void reusePort(int sock); <br><br>main( argc, argv )<br>int argc;<br>char *argv[];<br>
{<br> int s, ss;<br> struct sockaddr_in server;<br> struct sockaddr_in from;<br> int fromlen;<br> int length;<br><br> fd_set readfds, readfdsCopy;<br> int n,i;<br> int sockList[64], lastSock=0;<br> <br><br> /* Construct name of socket to send to. */<br>
server.sin_family = AF_INET;<br> server.sin_addr.s_addr = htonl(INADDR_ANY);<br> if (argc == 2)<br> server.sin_port = htons(atoi(argv[1])); <br> else<br> server.sin_port = htons(0); <br><br> s = socket (AF_INET,SOCK_STREAM,0); <br>
reusePort(s);<br><br> if ( bind( s, (struct sockaddr *)&server, sizeof(server) ) ) {<br> close(s);<br> perror("binding name to stream socket");<br> exit(-1);<br> }<br><br> length = sizeof(server);<br>
if ( getsockname (s, (struct sockaddr *)&server,&length) ) {<br> perror("getting socket name");<br> exit(0);<br> }<br><br> printf("Server Port is: %d\n", ntohs(server.sin_port));<br><br>
listen(s,4);<br> fromlen = sizeof(from);<br> FD_ZERO(&readfdsCopy);<br> FD_SET(s,&readfdsCopy);<br> <br> for(;;){<br> memcpy(&readfds, &readfdsCopy, sizeof(fd_set));<br> n = select(FD_SETSIZE, &readfds, (fd_set *) 0, (fd_set *) 0, NULL);<br>
if (n > 0) {<br> if (FD_ISSET(s, &readfds)) {<br> printf("Accepting a new connection...\n");<br> sockList[lastSock++] = accept(s, (struct sockaddr *)&from, &fromlen);<br> FD_SET(sockList[lastSock-1], &readfdsCopy);<br>
}<br> for (i=0; i < lastSock; i++) {<br> if (FD_ISSET(sockList[i], &readfds))<br> if (EchoServe(sockList[i]) < 0) {<br> FD_CLR(sockList[i], &readfdsCopy);<br> close (sockList[i]);<br>
sockList[i] = sockList[--lastSock];<br> i--;<br> printf("Number of current clients: %d\n", lastSock);<br> }<br> }<br> }<br> }<br>}<br>int EchoServe(int psd)<br>
{<br> char buf[512];<br> int rc;<br><br> /* get data from clients and send it back */<br> for(;;){<br> printf("\n...server is waiting...\n");<br> if( (rc=read(psd, buf, sizeof(buf))) < 0)<br> perror("receiving stream message");<br>
if (rc > 0){<br> buf[rc]='\0';<br> printf("Received: %s\n", buf);<br> if (send(psd, buf, rc, 0) <0 )<br> perror("sending stream message");<br> return(1);<br>
}<br> else {<br> printf("Disconnected..\n");<br> return(-1);<br> }<br> }<br>}<br>void reusePort(int s)<br>{<br> int one=1;<br><br> if ( setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *) &one,sizeof(one)) == -1 )<br>
{<br> printf("error in setsockopt,SO_REUSEPORT \n");<br> exit(-1);<br> }<br>} <br></pre><br><br><br><div class="gmail_quote">2010/11/24 Leonel Florin Selles <span dir="ltr"><<a href="mailto:leonel06033@cfg.jovenclub.cu">leonel06033@cfg.jovenclub.cu</a>></span><br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">Hola amigos:<br>
<br>
Bueno, quiero hacer dos programas que se ejecuten en la misma pc y que se<br>
comuniquen entre ellos a través de socket tipo UNIX o el sinónimo<br>
(local)(PF_UNIX) (PF_LOCAL) y a la misma vez estoy utilizando la función<br>
select, todo me trabaja perfecto, pero cuando el cliente manda datos al<br>
servidor la función select lo detecta una y otra vez como que el cliente<br>
esta mandando datos una y otra vez, pero es que el envío de esos datos<br>
solo los hago una vez, será que estas funciones no trabajan bien con<br>
sockets de tipo UNIX o LOCAL.<br>
<br>
Saludos, alguna sugerencia.<br>
<br>
<br>
_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br>
</blockquote></div><br>