🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: chile.comp.programacion
Article #3165

Re: problema programando socket

#3165
From: PS
Date: Mon, 23 May 2005 20:12
79 lines
3732 bytes
Rick_oj wrote:
> Estoy programando un socket, un amigo me paso un socket de conexion ya
> hecho, al cual le elimine lo que necesitaba y resulto en esto (codigo
> completo)
> 
> ********************* incio codigo********************************
>    printf("\tIngrese el correo que desea leer: ");
>    scanf("%d",&opc);
>    sprintf(buf,"RETR %d\n",opc);//con esto leo cada correo
>    if((numbytes=send(sockfd,buf,strlen(buf),0)) == -1)
>      {
>      perror("recv");
>      exit(1);
>      };
>    memset(buf,0x0,MAXDATASIZE);
>    if((numbytes=recv(sockfd,buf,MAXDATASIZE-1,0)) == -1)
>     {
>     perror("recv");
>     exit(1);
>     };
>     printf("\n\t%s",buf);
>     sleep(5);
>      sprintf(buf,"QUIT\n");
>      if((numbytes=send(sockfd,buf,strlen(buf),0)) == -1){
>           perror("recv");
>           exit(1);
>         };
>         memset(buf,0x0,MAXDATASIZE);
>         if((numbytes=recv(sockfd,buf,MAXDATASIZE-1,0)) == -1){
>           perror("recv"); exit(1);
>         };
>         close(sockfd);
>     }
> ****************** fin de codigo***************
> 
> el problema que tengo es que al ingresar el numero del correo que deso leer,
> solo me entrega la primera linea es decir
> "+OK xxxx bytes" (siendo xxx los bytes del correo), pareciera ser que solo
> la primera linea se almacena en buf, agradezco ayuda ya que de sockets no se
> mucho
> 

Hola,

Tu problema es que el protocolo POP te esta entregando primero que todo
algo conocido "+OK xxxx bytes" en donde te indica el taman~o en bytes 
que tiene el mensaje que quieres recibir, entonces en esa primera 
recepcion debes parsear dicha linea y obtener la cantidad de bytes, 
luego con otro read/recv obtienes dicha cantidad de bytes desde el socket.

De hecho para ser mas preciso, el servidor POP te esta enviando todo de 
1 vez (taman~o + mensaje) el punto es que no los podras obtener en 1 
solo read/recv pues el posiblemente el servidor lo hace con mas de 1 
write (1 para el taman~o y 1 o mas para el mensaje).

Como consejo, deberias utilizar algun approach usando una rutina de
fixread() que lea exactamente la cantidad de bytes que estas solicitando.

---- Cortar aqui -----
int fixread(int s, char *buff, int len)
{
    int l, index;
    index=0;
    while( len > 0 )
    {
       l = read(s, buff + index, len);

       if( l <= 0 )
          return l;
       index = index + l;
       len = len - l;
    }
    return index;
}
-----------------------

Saludos,

PS
Technical Details
Message-ID: <d6tdfe$8tf$1@helcaraxe.dcc.uchile.cl>
Path: arc1-ca.pugleaf.net!g2news1.google.com!news4.google.com!news.glorb.com!border1.nntp.dca.giganews.com!nntp.giganews.com!atl-c02.usenetserver.com!atl3-c02.usenetserver.com!newsfeed.yul.equant.net!news-santiago!helcaraxe.dcc.uchile.cl!not-for-mail
References: <d6loku$hgf$1@news1.nivel5.cl>

Show Full Headers
Complete Article Headers
X-Google-Thread: 1593cb,8a1971cc8ba8724e
X-Google-Thread: 1054ea,8a1971cc8ba8724e
X-Google-Attributes: gid1593cb,gid1054ea,public
X-Google-Language: SPANISH,ASCII-7-bit
Path: arc1-ca.pugleaf.net!g2news1.google.com!news4.google.com!news.glorb.com!border1.nntp.dca.giganews.com!nntp.giganews.com!atl-c02.usenetserver.com!atl3-c02.usenetserver.com!newsfeed.yul.equant.net!news-santiago!helcaraxe.dcc.uchile.cl!not-for-mail
From: PS <sin@mail.cl.edu>
Newsgroups: chile.comp.programacion,chile.comp.unix
Subject: Re: problema programando socket
Date: Mon, 23 May 2005 16:12:21 -0400
Organization: DCC - Universidad de Chile
Lines: 79
Message-ID: <d6tdfe$8tf$1@helcaraxe.dcc.uchile.cl>
References: <d6loku$hgf$1@news1.nivel5.cl>
NNTP-Posting-Host: anakena.dcc.uchile.cl
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Trace: helcaraxe.dcc.uchile.cl 1116879151 9135 192.80.24.6 (23 May 2005 20:12:31 GMT)
X-Complaints-To: newsmaster@dcc.uchile.cl
NNTP-Posting-Date: Mon, 23 May 2005 20:12:31 +0000 (UTC)
User-Agent: Mozilla Thunderbird 1.0.2 (Windows/20050317)
X-Accept-Language: en-us, en
In-Reply-To: <d6loku$hgf$1@news1.nivel5.cl>