Article View: chile.comp.programacion
Article #3165Re: problema programando socket
From: PS
Date: Mon, 23 May 2005 20:12
Date: Mon, 23 May 2005 20:12
79 lines
3732 bytes
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-mailReferences:
<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>