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.