Message-Id: <200311030704.hA374FHO012847@delorie.com> 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 Date: Mon, 3 Nov 2003 15:4:0 +0800 From: "zhouxin" To: "cygwin AT cygwin DOT com" Subject: Re: Re: select() take 100% CPU with cygwin1.5.5-1 in WinXP/Win2000 Mime-Version: 1.0 Content-Type: text/plain; charset="GB2312" Note-from-DJ: This may be spam Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by delorie.com id hA374FHO012847 I set a timeout for recvfrom() by calling select() on a UDP socket: socket()=>sendto()=>select()=>recvfrom(). It seems that it need not call bind() or connect() for UDP socket here. This method is recommended by "UNIX Network Programming Volum1 Networking APIs: Sockets and XTI(Second Edition)", W.Richard Stevens Chapter 13 section 2. source code: http://www.cs.odu.edu/~cs779/stevens2nd/lib/readable_timeo.c http://www.cs.odu.edu/~cs779/stevens2nd/advio/dgclitimeo.c >> if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0){ >> fprintf(stderr, "cannot open socket for udp packet!\n"); >> exit(1); >> } >> >> while(1){ >> struct timeval tv; >> fd_set fds; >> radius_send(sockfd, NULL, secret); >> FD_ZERO(&fds); >> FD_SET(sockfd, &fds); >> >> tv.tv_sec = timeout; >> tv.tv_usec = 0; >> printf("select the socket_fd : d, thread_id is : d\n", >> sockfd, tid); >> if((ret=select(sockfd + 1, &fds, NULL, NULL, &tv))==1) >> *rep = radius_recv(sockfd); >> ... This test code is cut from a multi-thread radius(Authentication,Accounting protocol,UDP) client. if radius thread count > 18,some thread's select() will take 100% CPU in cygwin envirionment, but the same code work ok in solaris and linux envirionment. >On Fri, Oct 31, 2003 at 01:14:17PM +0800, zhouxin wrote: >> Cygwin implementation of select() take 100 CPU under multi-thread environment sometimes. >> [...] >> if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0){ >> fprintf(stderr, "cannot open socket for udp packet!\n"); >> exit(1); >> } >> >> while(1){ >> struct timeval tv; >> fd_set fds; >> >> FD_ZERO(&fds); >> FD_SET(sockfd, &fds); >> >> tv.tv_sec = timeout; >> tv.tv_usec = 0; >> printf("select the socket_fd : d, thread_id is : d\n", >> sockfd, tid); >> select(sockfd + 1, &fds, NULL, NULL, &tv); >> } > >That's not allowed. What is the select call waiting for? You >didn't bind or connect it. > >Corinna > >-- >Corinna Vinschen Please, send mails regarding Cygwin to >Cygwin Developer mailto:cygwin AT cygwin DOT com >Red Hat, Inc. > >-- >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/ > > >. = = = = = = = = = = = = = = = = = = = = ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Ö Àñ£¡ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡zhouxin ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡zhoux AT harbournetworks DOT com ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡2003-11-03 -- 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/