Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 16 May 96 11:02:50 BST
From:      kbracey@art.acorn.co.uk (Kevin Bracey)
To:        freebsd-hackers@freebsd.org
Subject:   Problem with non-blocking TCP connects?
Message-ID:  <319B0B5A@kbracey>

next in thread | raw e-mail | index | archive | help
There is an interesting anomaly in the processing of non-blocking TCP
connections. In the case of a loop like

         while (!connected) {
         	if (connect(s, addr, addrlen) < 0) {
         		if (errno == EINPROGRESS || errno == EALREADY)
         			continue;
         		else if (errno == EISCONN)
         			connected = 1;
         		else
         			return errno;
         	} else
         		connected = 1;
         }
         
you would normally expect a sequence of errors from connect like:

              EINPROGRESS
              EALREADY
              EALREADY
              EALREADY
              EISCONN

or, if the connection is refused

              EINPROGRESS
              EALREADY
              EALREADY
              ECONNREFUSED

The former happens, but in the latter case you get EINVAL instead of
ECONNREFUSED.  This is because when the connection is refused, TCP discards
its PCBs and refuses to have anything to do with the relevant socket.

Should there be some sort of patch to tcp_usrreq() to check so->so_error (which
in the above case is actually set to ECONNREFUSED) and return that if set,
before complaining about the lack of a PCB?

Kevin Bracey
Acorn RISC Technologies



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?319B0B5A>