Lookat this, they've made a big mistake.
if socketList[currentSocket] is removed, the new socketList[currentSocket]
is never checked before currentSocket++;
the code below should be
for (currentSocket = 0; currentSocket < socketList.Count; /* WRONG
currentSocket++*/)
{
...
if (currentFileDescriptor==fileDescriptorSet.Count) {
//
// descriptor not found: remove the current socket and start again
//
socketList.RemoveAt(currentSocket);
}
/* ADD HERE */
else currentSocket++;
}
I found this when I use the offical .NET framework with SELECT. but weird
things happen. So I check sscli in FreeBSD, problems remain. From sscli's
source...
To my disappointment, the second Beta Refresh hasn't fixed this error. How
could I believe in .NET and construct my project on it?
////part of source from sscli, in fx\src\net\system\net\sockets\socket.cs
//
// Transform the list socketList such that the only sockets left are those
// with a file descriptor contained in the array "fileDescriptorArray"
//
...
for (currentSocket = 0; currentSocket < socketList.Count; currentSocket++) {
//
// parameter validation: only Socket should be here
//
if (!(socketList[currentSocket] is Socket)) {
throw new ArgumentException("socketList");
}
socket = (Socket)socketList[currentSocket];
//
// Look for the file descriptor in the array
//
for (currentFileDescriptor = 0; currentFileDescriptor <
fileDescriptorSet.Count; currentFileDescriptor++) {
if (fileDescriptorSet.Array[currentFileDescriptor]
==socket.m_Handle) {
break;
}
}
if (currentFileDescriptor==fileDescriptorSet.Count) {
//
// descriptor not found: remove the current socket and start again
//
socketList.RemoveAt(currentSocket);
}
}