[Mono-list] Socket.Select problem

RoBiK robik@mailbox.sk
Tue, 4 May 2004 10:57:08 +0200


Hi!

It seems to me, that you don't fully understand the concept of select/poll.
The behavior that you describe is correct fo select & poll.
For your app, you should use poll, because you are working with single
socket. Use select only if you need to work with multiple socket
simultaneous.

Try this:

		public string GetMessage(int timeOut, Socket socket)
		{
			string s = string.Empty;
			while(socket.Poll(timeOut, SelectMode.SelectRead))
			{
				byte[] buffer = new byte[1];
				int count = socket.Receive(buffer, 1,
SocketFlags.None);
				if(count == 0)
				{
					//connection closed
					return string.Empty;
				}
				else
				{
					char c = (char)buffer[0];
					if(c == '\n')
					{
						//end of line received
						return s;
					}
					s += c;
				}
			}
			//timeout
			return string.Empty;
		}


Here is the MSDN documentation for Socket.Poll:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/
frlrfsystemnetsocketssocketclasspolltopic.asp


Robert

-----Original Message-----
From: Dennis Jarosch [mailto:ya_luva@uni.de] 
Sent: Montag, 03. Mai 2004 22:37
To: mono-list@ximian.com
Subject: [Mono-list] Socket.Select problem

Hi!!

This is probably not mono-devel related but I'd really appreciate it, if
somebody could help.

I am writing a client application (w/ mono and C#) that communicates with
the server via message-strings. These strings are terminated by the usual
'\n'. The '\n' may be followed by additional data, which is why the string
has to be processed before reading the rest.

I am currently getting one character at a time, checking the socket-state
with Socket.Select. Yes, using a buffer would be nice, but the
server-protocol forces me to do it this way. ;-)

Somehow Select (and Poll, which I have also tried) does not seem to work
correctly. Sometimes I get correct results, mostly nothing is read though.
When using a buffer, everything works rather fine. When using -1 as timeout
value, everything works fine but blocks after the last char.

This is my code:
++++++++++++++++++++++++ Select

ArrayList listenList = new ArrayList();
listenList.Add(socket);

int count = 0;
bool read = true;

while (read)
{
	read = false;
	Socket.Select(listenList, null, null, 5000);
				
	if (listenList.Contains(socket))
	{					
		read = true;
		count = socket.Receive(buffer, 1, SocketFlags.None);

		Console.WriteLine("count: " + count);

		message += (char)buffer[0];
				
		if ((char)buffer[0] == '\n')
			return message;
	}
}

++++++++++++++++++++++++ Poll

while (socket.Poll(-1, SelectMode.SelectRead)) {
	count = socket.Receive(buffer, 1, SocketFlags.None);

	message += (char)buffer[0];
				
	if ((char)buffer[0] == '\n')
		return message;	
}

++++++++++++++++++++++++

Thanks for reading!
Dennis


_______________________________________________
Mono-list maillist  -  Mono-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-list