This is the mail archive of the cygwin-developers@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Interruptable connect



On Thu, 4 Jul 2002, Thomas Pfaff wrote:

>
>
> On Thu, 4 Jul 2002, Corinna Vinschen wrote:
>
> > On Thu, Jul 04, 2002 at 02:54:44PM +0200, Thomas Pfaff wrote:
> > > > Sure, but how will this help ? You can not look ahead if the connect will
> > > > be reentered or not. If the program is well written it will or close the
> > > > socket afterwards, but should i rely on this ?
> > > >
> > >
> > > To be more precise:
> > > I have no problems with unclosed sockets but with a connected socket
> > > that shouldn't be connected.
> >
> > I see.  The question is if we're able to get around that Winsock'ism.
> >
> > Perhaps Winsock2 helps a bit.
> >
> > This is just brainstorming, I have no idea if that works:
> >
> > When connect is called, create a duplicate of the socket first,
> > before actually connecting, using the WSADuplicateSocket call.
> > This should give you a structure describing the socket in exactly
> > the state before the ::connect call.  Now for the cases:
> >
> > - Normal connect, success, erase the duplicate.
> > - Normal connect, failure, ditto.
> > - Interrupt, close original socket and recreate it from the duplicate
> >   using WSASocket.
> >
> > Would that work???
> >
>
> Sounds good, but i am not 100 % sure if the duplicated socket is created
> in exactly the same state than the original one before WSAEventSelect.
> The remarks in WSADuplicateSocket are not clear, especially whether it is
> possible to close the original socket first and then create the duplicate.
> I will make some tests.
>

Unfortunately this does't help here. If i call WSADuplicateSocket the
socket is really a duplicate, it is not closed until i create a new socket
with WSASocket. I have attached my test prog.
The connection is not closed by closesocket after the first connect and
the second connect will fail with WSAISCONN.

Thomas

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>

int main(void)
{

   WSADATA wsaData;
   SOCKET sock;

   WSAPROTOCOL_INFO proto_info;

   struct sockaddr_in s_server;

   struct sockaddr_in sin;
   struct sockaddr_in s_test;
   int namelen = sizeof(s_test);

   WSAStartup( 0x202, &wsaData );

   sock = socket(AF_INET,SOCK_STREAM,0);

   sin.sin_family = AF_INET;
   sin.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
   sin.sin_port = htons( 5679 );

   bind( sock, (struct sockaddr*) &sin, sizeof( sin ) );

   if (WSADuplicateSocket(sock, GetCurrentProcessId(), &proto_info))
   {
      int err = WSAGetLastError();

      return 3;
   }

   s_server.sin_family = AF_INET;;
   s_server.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
   s_server.sin_port = htons( 5678 );
   if( connect( sock, (struct sockaddr*) &s_server, sizeof( s_server ) ) <
0 )
   {
      printf( "%d\n", WSAGetLastError());
      return 0;
   }
   closesocket(sock);
   sock = WSASocket( FROM_PROTOCOL_INFO,
                     FROM_PROTOCOL_INFO,
                     FROM_PROTOCOL_INFO,
                     &proto_info, 0, 0);
   if( connect( sock, (struct sockaddr*) &s_server, sizeof( s_server ) ) <
0 )
   {
      printf( "%d\n", WSAGetLastError());
      return 0;
   }

   closesocket(sock);

   return 0;
}



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]