+ {
+ Sleep (ms_total);
+ return 0;
+ }
+
+ if (select_thread == NULL)
+ {
+ SOCKET select_listening_socket = -1;
+ struct sockaddr_in s_in;
+ int alen;
+ int res;
+ unsigned long p;
+
+ select_standby_event = CreateEvent (NULL, TRUE, FALSE, NULL);
+ select_finished_event = CreateEvent (NULL, TRUE, FALSE, NULL);
+
+ select_wakeup_socket = WSASocket (AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
+
+ select_listening_socket = WSASocket (AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
+
+ p = 1;
+ res = ioctlsocket (select_wakeup_socket, FIONBIO, &p);
+ LOG (GNUNET_ERROR_TYPE_DEBUG, "Select thread initialization: ioctlsocket() returns %d\n", res);
+
+ alen = sizeof (s_in);
+ s_in.sin_family = AF_INET;
+ s_in.sin_port = 0;
+ s_in.sin_addr.S_un.S_un_b.s_b1 = 127;
+ s_in.sin_addr.S_un.S_un_b.s_b2 = 0;
+ s_in.sin_addr.S_un.S_un_b.s_b3 = 0;
+ s_in.sin_addr.S_un.S_un_b.s_b4 = 1;
+ res = bind (select_listening_socket, (const struct sockaddr *) &s_in, sizeof (s_in));
+ LOG (GNUNET_ERROR_TYPE_DEBUG, "Select thread initialization: bind() returns %d\n", res);
+
+ res = getsockname (select_listening_socket, (struct sockaddr *) &s_in, &alen);
+ LOG (GNUNET_ERROR_TYPE_DEBUG, "Select thread initialization: getsockname() returns %d\n", res);
+
+ res = listen (select_listening_socket, SOMAXCONN);
+ LOG (GNUNET_ERROR_TYPE_DEBUG, "Select thread initialization: listen() returns %d\n", res);
+
+ res = connect (select_wakeup_socket, (const struct sockaddr *) &s_in, sizeof (s_in));
+ LOG (GNUNET_ERROR_TYPE_DEBUG, "Select thread initialization: connect() returns %d\n", res);
+
+ select_send_socket = accept (select_listening_socket, (struct sockaddr *) &s_in, &alen);
+
+ closesocket (select_listening_socket);
+
+ sp.wakeup = select_finished_event;
+ sp.standby = select_standby_event;
+ sp.wakeup_socket = select_wakeup_socket;
+
+ select_thread = CreateThread (NULL, 0, _selector, &sp, 0, NULL);
+ }