Socket server + thread: cpu usage
Tim via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Thu May 1 01:08:30 PDT 2014
On Tuesday, 29 April 2014 at 17:19:41 UTC, Adam D. Ruppe wrote:
> On Tuesday, 29 April 2014 at 17:16:33 UTC, Tim wrote:
>> Is there anything I'm doing wrong?
>
> You should be using a blocking socket. With them, the operating
> system will put your thread on hold until a new connection
> comes in. Without them, it will endlessly loop doing absolutely
> nothing except checking if a new connection is there yet.
> Horribly, horribly inefficient.
Blocking sockets are now working as expected, but I've one
problem. When I do the following in my server-accept-thread:
while (m_oSocket.isAlive)
{
oSocketSet.reset();
oSocketSet.add(m_oSocket);
nAcceptedSockets = Socket.select(oSocketSet, null, null,
25.msecs);
if (nAcceptedSockets > 0)
{
// Do something...
}
}
... and the following in my client:
void connect()
{
m_oSocket = new TcpSocket(AddressFamily.INET);
m_oSocket.connect(new InternetAddress("127.0.0.1", 12345));
}
The CPU usage is low as long as my connect is connected. When I
disconnect the client using the following few lines:
void disconnect()
{
m_oSocket.shutdown(SocketShutdown.BOTH);
m_oSocket.close();
}
... the CPU usage goes up. I think that SocketShutdown.BOTH
causes Socket.select to fail which results in an endless loop.
Any suggestions how to handle that problem?
@Ali Çehreli: Thanks, didn't know that UFCS can also handle such
constructs :)
More information about the Digitalmars-d-learn
mailing list