cURL / Mailing Lists / curl-library / Single Mail

curl-library

Re: connect failed if set socket non-blocking,why?

From: Andy Hobbs <andy_at_hobbs.uk.net>
Date: Mon, 25 Oct 2004 13:31:21 +0100

Hi,

When compiling you own code you **MUST** always use _REENTRANT otherwise
all sorts of libraries will cause lots of errors as they won't be thread
safe. to get errno to be thread safe you **MUST** also specify
_LIBC_REENTRANT

to do this (using gcc) -D_REENTRANT -D_LIBC_REENTRANT when compiling the
c code, it is not used when linking

Andy

On Mon, 2004-10-25 at 12:36, 黄志军 wrote:
> ----- Original Message -----
> From: "Andy Hobbs" <andy_at_hobbs.uk.net>
> To: "libcurl development" <curl-library_at_cool.haxx.se>
> Sent: Monday, October 25, 2004 6:55 PM
> Subject: Re: connect failed if set socket non-blocking,why?
>
>
> > Hi
> >
> > Are you using threads?
> Yes, I am using threads.
> >
> > if so are you using thread safe errno? you need to specify
> >
> > _REENTRANT
> > and
> > _LIBC_REENTRANT
> >
> > when compiling
> >
> u mean compile my program or compile the curl?
> Where should i add the compile option of _REENTRANT and _LIBC_REENTRANT?
>
>
> > Here is a section of my code that handles this:
> >
> >
> > if ((n = connect(sockfd, (struct sockaddr *) saptr, salen)) < 0)
> > {
> > if (errno != EINPROGRESS)
> > {
> > errprint("sockError after connect %d, tid %d", errno,
> > pthread_self());
> > close(sockfd);
> > if (sockError == EINTR)
> > sockError = ETIMEDOUT;
> > }
> > else
> > {
> > // Call select to wait for writability or timeout or error
> > // use getsockopt to find any errors from select
> > select(sockfd + 1, NULL, &wrset, NULL, &timeout);
> >
> > // The descriptor should now be writable unless there was a
> > timeout
> > len = sizeof(sockError);
> > getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &sockError, &len);
> >
> > if (sockError != 0)
> > errprint("sockError %d not 0 %d, %d", sockfd, sockError,
> > errno);
> >
> > n = sockError;
> > }
> > }
> >
> >
> > Andy
> >
> >
> >
> > On Mon, 2004-10-25 at 11:17, 黄志军 wrote:
> > > ----- Original Message -----
> > > From: "Andy Hobbs" <andy_at_hobbs.uk.net>
> > > To: "libcurl development" <curl-library_at_cool.haxx.se>
> > > Sent: Monday, October 25, 2004 5:45 PM
> > > Subject: Re: connect failed if set socket non-blocking,why?
> > >
> > >
> > > > Hi,
> > > >
> > > > connect returns instantly when the socket is non-blocking, you need to
> > > > call select() and wait for the connect to complete.
> > >
> > > connect return value is -1 ,but errno is also 0, that is the key reason puzzling me.
> > > >
> > > > Andy
> > > >
> > > >
> > > > On Mon, 2004-10-25 at 09:57, 黄志军 wrote:
> > > > > I link my program with static library libcurl.a and find it always
> > > > > return CURLE_COULDNT_CONNECT.
> > > > >
> > > > > if i ignore function Curl_nonblock() in connect.c( curl-7.12.2), the
> > > > > curl_easy_perform return success and works fine.
> > > > >
> > > > > But if set socket to non-blocking, the connect() return -1(rc = -1)
> > > > >
> > > > > and i got the following info: "errno in curl=0" and "errno out
> > > > > curl=150", why?
> > > > >
> > > > >
> > > > > /*../lib/connect.c*/
> > > > > /* set socket non-blocking */
> > > > > Curl_nonblock(sockfd, TRUE);
> > > > >
> > > > > rc = connect(sockfd, ai->ai_addr, ai->ai_addrlen);
> > > > >
> > > > > fprintf(stderr, "errno in curl=%d\n", errno);
> > > > >
> > > > > if(-1 == rc) {
> > > > > error = Curl_ourerrno();
> > > > > fprintf(stderr, "errno in curl=%d\n", errno);
> > > > >
> > > > >
> > > > > /*my multi-thread program:*/
> > > > > curl_easy_perform(curl);
> > > > > fprintf(stderr, "errno out curl=%d\n", errno);
> > > > >
> > > > --
> > > > Andy Hobbs <andy_at_hobbs.uk.net>
> > > >
> > --
> > Andy Hobbs <andy_at_hobbs.uk.net>
> >

-- 
Andy Hobbs <andy_at_hobbs.uk.net>
Received on 2004-10-25