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>