On Wednesday, 16 March 2016 at 20:44:12 UTC, Lucien wrote:
Hello,

I want to know if a port of an ip address is listening, actually, I've this :
http://pastebin.com/pZhm0ujy
(checking port 22/ssh)

It works, but it took me ~10min to scan 30 addresses.

How can reduce the expiration delay ?

Finally solved :

---------------------------------------------

import std.stdio;
import std.socket;
import std.conv;
import core.time;
import core.thread;

void main()
{
    enum TRIES = 5, MAX = 254;

    string subnet = "192.168.0.";
    Socket[] sockets = new Socket[MAX];
    SocketSet ss = new SocketSet(MAX + 1);

    for (int i = 0; i < MAX; i++)
    {
        string ip = subnet~to!string(i+1);

        InternetAddress ia = new InternetAddress(ip, 22);

        TcpSocket s = new TcpSocket();
        s.blocking = false;
s.setOption(SocketOptionLevel.SOCKET, SocketOption.RCVTIMEO, 100.msecs); s.setOption(SocketOptionLevel.SOCKET, SocketOption.SNDTIMEO, 100.msecs);
        s.connect(ia);

        sockets[i] = s;
    }

    for (int i = 0; i < TRIES; i++) {
        ss.reset();
        foreach (s; sockets) {
            if (s !is null)
                ss.add(s);
        }
        int status = Socket.select(null, ss, null, 100.msecs);

        if (status > 0)
        {
            for (int j = 0; j < sockets.length; j++)
            {
                if (sockets[j] !is null && ss.isSet(sockets[j]))
                {
                    try {
writeln(sockets[j].remoteAddress().toString());
                        ss.remove(sockets[j]);
                        sockets[j].close();
                        sockets[j] = null;
                    } catch {
                    }
                }
            }
        }
        Thread.sleep(50.msecs);
    }
}

Reply via email to