Previous: Concurrent Clients Server, Up: Communications Samples [Index]
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.