Previous: , Up: Communications Samples   [Index]


13.15.3.4 Echo Server

A server echoing complete lines:

void
readc(dispatch w, file i, file o, data b)
{
    integer e;
    data t;

    while (1) {
	e = f_b_read(i, t, 1 << 10);
	if (e < 1) {
	    if (e == -1) {
		w_resign(w, i);
	    }

	    break;
	} else {
	    e = b_frame(t, '\n');
	    if (e != -1) {
		e += 1;
		b_rule(b, -1, t, 0, e);
		f_data(o, b);
		w_register(w, o);
		b_ecopy(b, t, e, ~t - e);
	    } else {
		b_add(b, t);
	    }
	}
    }
}


void
serve(dispatch w, file s)
{
    file i, o;
    data b;

    accept(i, o, s, NONBLOCKING_INPUT | NONBLOCKING_OUTPUT);
    w_watch(w, i, readc, w, i, o, b);
}


integer
main(void)
{
    dispatch w;
    file s;

    tcpip_listen(s, 12321, 0);
    w_watch(w, s, serve, w, s);
    w_press(w);

    return 0;
}

Function readc keeps reading (and without blocking) for as long as there’s still data available. Read data is scanned for new lines and completed lines are transmitted at once, partial lines are kept.