This is the mail archive of the
cygwin
mailing list for the Cygwin project.
Re: recv and errno during a connection reset/closed by peer
- From: Igor Pechtchanski <pechtcha at cs dot nyu dot edu>
- To: cygwin at cygwin dot com
- Date: Fri, 25 Mar 2005 09:24:45 -0500 (EST)
- Subject: Re: recv and errno during a connection reset/closed by peer
- References: <!~!UENERkVCMDkAAQACAAAAAAAAAAAAAAAAABgAAAAAAAAAUKQItienSEKG+9226yKd5cKAAAAQAAAAABEV8lCYiUqikvlg/nhWLAEAAAAA@sbcglobal.net> <4243C14B.AC1A0432@dessent.net>
- Reply-to: cygwin at cygwin dot com
On Thu, 24 Mar 2005, Brian Dessent wrote:
> Peter Stephens wrote:
>
> > When in non-blocking mode I thought I would be able to get a return
> > from recv of '-1' and then check errno, but it never seems to be
> > anything but '11', or EAGAIN. This seems to be true whether I
> > MSG_PEEK or not.
> >
> > I have included my code below. The intention is that for recv returns
> > greater than zero, there is a message and I should process it and get
> > ready for the next one. For recv returns of '0' I should do nothing
> > and for recv returns of '-1' I should handle per errno.
> >
> > Seems easy enough, but no matter what I have tried I can only get a recv
> > return of EAGAIN.
> > ...
> > rcv_length = recv(threadarg->new_fd,NULL,NULL,MSG_PEEK);
>
> Try passing a buffer and length to recv(). The Cygwin code does not
> attempt to do anything with the socket if buf = NULL and len = 0. (You
> can look at it yourself, file winsup/cygwin/net.cc, functions
> cygwin_recv() and cygwin_recvfrom().) How would you ever expect recv()
> to return >0 when you don't give it a buffer to put the data into?
AIUI, recv with MSG_PEEK is supposed to return the length of the waiting
data without putting anything in the buffer.
> The POSIX standard doesn't say anything about the behavior of recv()
> when buf=NULL so what you're trying to do must be some nonstandard quirk
> of other systems' libc.
The SUSv6 page on recv also doesn't mention the possibility of the buffer
being NULL. I'd suggest to the OP to pass in a dummy 1-character buffer
to recv() with MSG_PEEK, e.g.,
char c;
...
rcv_length = recv(threadarg->new_fd,&c,1,MSG_PEEK);
HTH,
Igor
--
http://cs.nyu.edu/~pechtcha/
|\ _,,,---,,_ pechtcha@cs.nyu.edu
ZZZzz /,`.-'`' -. ;-;;,_ igor@watson.ibm.com
|,4- ) )-,_. ,\ ( `'-' Igor Pechtchanski, Ph.D.
'---''(_/--' `-'\_) fL a.k.a JaguaR-R-R-r-r-r-.-.-. Meow!
"The Sun will pass between the Earth and the Moon tonight for a total
Lunar eclipse..." -- WCBS Radio Newsbrief, Oct 27 2004, 12:01 pm EDT
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/