Dear Sir: >That's right - the change you're proposing makes no sense, because >"readSet" should already have the correct socket numbers (and no >others) set, because of the assignment (at the start of the >"SingleStep()" function: > fd_set readSet = fReadSet; // make a copy for this select() call
After writing some more debug code to print fds in readSet before/after reset, I found that the readSet before/after reset is logically the same but different physically in order!!! That's the problem. I found this article describing this issue: http://blogs.msdn.com/wndp/archive/2006/07/13/664737.aspx The fReadSet is filled with mixed sockets of UDP/TCP and select() on Windows XP returns WSAENOTSOCK for me! I guess that's why they can be selected individually without problem. BTW, not many PCs in my test environments(<10) but I have seen two PCs had the problem. PS: the debug code in BasicTaskScheduler::SingleStep() for reference. { FILE *fp = fopen("c:\\live555.txt", "a"); fprintf(fp, "[BasicTaskScheduler::SingleStep()] maximum fd %d, there %d fds in fReadSet while %d ones in readSet\n", fMaxNumSockets - 1, fReadSet.fd_count, readSet.fd_count); for(size_t i = 0; i < readSet.fd_count; i++) fprintf(fp, "[BasicTaskScheduler::SingleStep()] readSet has fd %d while fReadSet has fd %d\n", readSet.fd_array[i], fReadSet.fd_array[i]); int selectResult = select(fMaxNumSockets, &readSet, NULL, NULL, &tv_timeToDelay); fprintf(fp, "[BasicTaskScheduler::SingleStep()] select(readSet via copy) return %d with err %d\n", selectResult, selectResult < 0 ? WSAGetLastError() : 0); fclose(fp); } { HandlerIterator iter(*fReadHandlers); HandlerDescriptor* handler; FD_ZERO(&readSet); while ((handler = iter.next()) != NULL) FD_SET((unsigned)handler->socketNum, &readSet); FILE *fp = fopen("c:\\live555.txt", "a"); fprintf(fp, "[BasicTaskScheduler::SingleStep()] max fd %d, there %d fds in reset fReadSet while %d ones in readSet\n", fMaxNumSockets - 1, fReadSet.fd_count, readSet.fd_count); for(size_t i = 0; i < readSet.fd_count; i++) fprintf(fp, "[BasicTaskScheduler::SingleStep()] reset readSet has fd %d while fReadSet has fd %d\n", readSet.fd_array[i], fReadSet.fd_array[i]); fclose(fp); } BR. Brain Lai int selectResult = select(fMaxNumSockets, &readSet, NULL, NULL, &tv_timeToDelay); { FILE *fp = fopen("c:\\live555.txt", "a"); fprintf(fp, "[BasicTaskScheduler::SingleStep()] select(readSet via reset) return %d with err %d\n", selectResult, selectResult < 0 ? WSAGetLastError() : 0); fclose(fp); }
_______________________________________________ live-devel mailing list live-devel@lists.live555.com http://lists.live555.com/mailman/listinfo/live-devel