Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com X-Originating-IP: [203.29.131.24] X-Originating-Email: [arashp AT hotmail DOT com] X-Sender: arashp AT hotmail DOT com From: "Arash Partow" To: cygwin AT cygwin DOT com Subject: re: pthreads and sockets - Cannot register window class error Date: Wed, 05 May 2004 11:04:09 +0000 Mime-Version: 1.0 Content-Type: text/plain; format=flowed Message-ID: X-OriginalArrivalTime: 05 May 2004 11:04:09.0731 (UTC) FILETIME=[B0DF2530:01C43290] X-IsSubscribed: yes Hi, I can't replicate your problem, but I know where it is coming from, basically standard windows winsock is not geared up to handle that man socket connections. When a socket is made and then closed the socket actually stays open for about 240-300 seconds depending on your registry settings, this is so that winsock can make sure the connection has been properly closed off. Whilst this 240-300 seconds is passing by the socket is actually still alive meaning the memory it occupies is still valid, its not until the 240 seconds has passed does winsock go and clean up the instance of the socket. what you are seeing is that basically as you run your program more and more times, you are creating sockets in memory, every time the socket is closed YOU think that the socket is cleaned up but its not, and so you basically loose a bit of memory until the timeout for the socket has occurred, i guess through debugging where you run and re-run your test app you have run out of RAM so you see these errors. this explains the whole thing: http://www.winguides.com/registry/display.php/878/ The only thing you can do is not make so many client socket connections or use windows server which has a winsock geared for server like behavior, or make the modifications mentioned in the article, or just simply use *bsd or linux tcp/ip stack. Regards Arash Partow __________________________________________________ Be one who knows what they don't know, Instead of being one who knows not what they don't know, Thinking they know everything about all things. http://www.partow.net >Hi again, > >I have problem using pthreads together with sockets on cygwin 1.5.9-1, >win2k sp4. > >Here is minimal app where I can reproduce errors. It will start 70 >threads and fetch http://example.org/ page on every each of them. Please >change host on line: > const char *HOST = "example.org"; >if you don't want to DDOS it ;) > >--- ThreadingTest.cpp ------------------------------------------------- >#include >#include >#include > >#include >#include >#include >#include >#include >#include >#include >#include > >using std::cout; >using std::endl; > > >const char *HOST = "example.org"; >const int PORT = 80; >const char *MESSAGE = "GET / HTTP/1.0\r\n\r\n"; > > >void sendall( int sd, const char *data, int datalen ) >{ > assert( data ); > assert( datalen >= 0 ); > while(datalen>0) { > int sent = send(sd, data, datalen, 0); > if( sent == -1) { > perror("send"); > exit(1); > } > data += sent; > datalen -= sent; > assert( datalen>=0 ); > } >} > > >void recvandprintall( int sd ) >{ > const int bufferlen = 65536; > char buffer[bufferlen]; > > while(true) { > int got = recv(sd, buffer, bufferlen, 0); > if(got == -1) { > perror("recv"); > exit(1); > } > if(got==0) { > cout << "got\n"; > cout.flush(); > break; > } > } >} > > >void test() >{ > /* go find out about the desired host machine */ > struct hostent *he = gethostbyname(HOST); > if (he == 0) { > perror("gethostbyname"); > exit(1); > } > assert( he->h_addrtype == AF_INET ); > assert( he->h_addr_list[0] ); > > /* fill in the socket structure with host information */ > struct sockaddr_in pin; > memset( &pin, 0, sizeof(pin) ); > pin.sin_family = AF_INET; > pin.sin_addr.s_addr = ((struct in_addr *)(he->h_addr))->s_addr; > pin.sin_port = htons(PORT); > > /* grab an Internet domain socket */ > int sd; > if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { > perror("socket"); > exit(1); > } > > /* connect to PORT on HOST */ > if (connect(sd,(struct sockaddr *) &pin, sizeof(pin)) == -1) { > perror("connect"); > exit(1); > } > > /* send a message to the server PORT on machine HOST */ > sendall( sd, MESSAGE, strlen(MESSAGE) ); > > /* shutdown writing part of socket */ > shutdown( sd, SHUT_WR ); > > /* wait for data to come back from the server and print it */ > recvandprintall( sd ); > > close(sd); >} > > >void *task(void *arg) >{ > test(); > return NULL; >} > > >int main() >{ > const int threads = 70; > pthread_t threadTable[threads]; > > for(int i=0; i { > if(pthread_create(&threadTable[i], NULL, task, (void *)(i+1)) != >0) > { > cout << "pthread_create() error" << endl; > abort(); > } > } > > for(int i=0; i { > pthread_join( threadTable[i], NULL ); } > > return 0; >} >--- ThreadingTest.cpp ------------------------------------------------- > > >Compile and run it this way: > >>$ g++ ThreadingTest.cpp -lpthread -o ThreadingTest.exe && >>./ThreadingTest.exe >>got >>got >>got >[...] > >If everything goes right, then it prints "got" 70 times and quits. > > >However sometimes it fails this way (you may need to run it several >times to reproduce error): > >>$ g++ ThreadingTest.cpp -lpthread -o ThreadingTest.exe && >>./ThreadingTest.exe >> 285 [win] ThreadingTest 1476 Winmain: Cannot register window class, >>Win32 error 1410 >> 305 [win] ThreadingTest 1476 Winmain: Cannot register window class, >>Win32 error 1410 >> 1998 [win] ThreadingTest 1476 Winmain: Cannot register window class, >>Win32 error 1410 >>D:\Sources\Test\ThreadingTest.exe (2040): *** WFSO failed, Win32 error 6 >> 312 [win] ThreadingTest 1476 Winmain: Cannot register window class, >>Win32 error 1410 >>got > > >I've seen also this problem: >>$ g++ ThreadingTest.cpp -o ThreadingTest.exe && ./ThreadingTest.exe >>gethostbynamegethostbyname: Operation not permitted > >(BTW. Is -lpthread necessary? It does link without it. Is it implied?) > > >I've googled on this and found thread with similar problem, no solution >though: > >http://groups.google.com/groups?lr=&ie=UTF-8&threadm=b840abf4.0401221419.343cb5e1%40posting.google.com&rnum=1&prev=/groups%3Fq%3Dpython%2BCannot%2Bregister%2Bwindow%2Bclass%26hl%3Dpl%26lr%3D%26ie%3DUTF-8%26oe%26inlang%3Dpl%26selm%3Db840abf4.0401221419.343cb5e1%2540posting.google.com%26rnum%3D1 >http://www.cygwin.com/ml/cygwin/2004-01/msg01371.html >http://www.cygwin.com/ml/cygwin/2004-02/msg00101.html > > >Looks like race-condition somewhere. > >Best regards, >Jacek. . _________________________________________________________________ SEEK: Now with over 50,000 dream jobs! Click here: http://ninemsn.seek.com.au?hotmail -- 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/