On Saturday, 19 March 2016 at 18:24:38 UTC, Marc Schütz wrote:
On Saturday, 19 March 2016 at 09:55:13 UTC, Lucien wrote:
    const int MAX = 64;
    Socket[] sockets = new Socket[MAX];
    string ipb = "192.168.0.";

    for (int i = 1; i < MAX; i++) {

Here's the reason for your SEGV: You need to start at 0, because otherwise `sockets[0]` is `null`. When you add that to the SocketSet, it will trigger the segfault. I guess you want to skip the 0 because it represents the subnet address; in that case, you simply mustn't add `sockets[0]` to the set.

But then there is another problems: You're using `select()` the wrong way. The point of using select() is that you can check things asynchronously. Your code should be structured like this (pseudo code):

auto ss = new SocketSet();
for(i; 1 .. MAX) {
    auto s = new Socket(...);
    s.blocking = false;
    s.connect(...);
    ss.add(s);
}

while(ss.count > 0) {
    auto write_ss = ss.dup;
auto status = Socket.select(null /* read */, write_ss /* write */, null /* error */, 500.msecs);
    // for a connect()ing socket, writeability means connected
    if(status < 0)
        writeln("interrupted, retrying");
    else if(status == 0)
        writeln("timeout, retrying");
    else {
        writeln(status, " socket(s) changed state");
        for(fd; 0 .. write_ss.maxfd+1) {
            // check whether this socket has changed
            if(!write_ss.isSet(fd)) continue;
            // if yes, remove it from the original SocketSet
            ss.remove(fd);
writeln("successfully connected to 192.168.0.", fd+1);
        }
    }
}

thanks, but what's the type of fd ?

current code:
--------------------------------
const int MAX = 64;
// usefull ?
Socket[] sockets = new Socket[MAX];
string ipb = "192.168.0.";
SocketSet ss = new SocketSet();

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

Socket s = new Socket(AddressFamily.INET, std.socket.SocketType.STREAM, ProtocolType.TCP);
    s.blocking = false;
    InternetAddress ia = new InternetAddress(ip, 22);
    sockets[i] = s;
    s.connect(ia);
    ss.add(s);
}

while (ss.max > 0)
{
    SocketSet write_ss = ss;
    auto status = Socket.select(null, write_ss, null, 50.msecs);
    // for a connect()ing socket, writeability means connected
    if(status < 0)
        writeln("interrupted, retrying");
    else if(status == 0)
        writeln("timeout, retrying");
    else {
        writeln(status, " socket(s) changed state");
        for (int i = 0; i < write_ss.tupleof[1]; i++) {
            // tried to do something
            //Socket fd = write_ss.tupleof[0][i];
            string ip = ipb~to!string(i+1);
            if(!write_ss.isSet(fd))
                continue;
            ss.remove(fd);
            writeln("successfully connected to ", ip);
        }
    }
}

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

Reply via email to