- if (err == ERR_OK) {
- outputf("RFB: sent %d", sndlength);
- state->update_pos += sndlength;
- } else {
- outputf("RFB: send error %d", err);
- }
+ if (left > tcp_mss(pcb)) {
+ sndlength = tcp_mss(pcb);
+ } else {
+ sndlength = left;
+ }
+
+ memcpy(mbuf, fb->fbaddr + state->update_pos, sndlength); /* It's OK if it becomes smaller later. */
+
+ do {
+ err = tcp_write(pcb, mbuf, sndlength, TCP_WRITE_FLAG_COPY /* This is my memory on the stack, thank you very much. */);
+ if (err == ERR_MEM) {
+ outputf("RFB: ERR_MEM sending %d", sndlength);
+ sndlength /= 2;
+ }
+ } while (err == ERR_MEM && sndlength > 1);
+
+ if (err == ERR_OK) {
+ outputf("RFB: attempting send %d", sndlength);
+ } else {
+ outputf("RFB: send error %d", err);
+ break;
+ }