前回のTCP/IP対応とwebサーバにちょっとバグがあったので修正. 以下,修正したソース. なおブートローダーは前回と同じ.
セッションをクローズする際に,FINを送信すると同時に status をFINWAIT1に していたので,まだ送信中のパケットがある場合にも status が強制的に FINWAIT1に遷移してしまい,バッファリングされている送信パケットが 正常に送信されなくなってしまうというもの.このため httpd でデータの送信後に セッションを切ろうとすると,うまくデータが送信されない.
以下はhttpd.cの修正.上記問題のためにセッションを切らないようにしていたが, 今回解決したので元に戻す.
@@ -305,13 +305,7 @@
ret = parse(number, buffer);
memmove(buffer, r, p - r + 1);
p -= (r - buffer);
-#if 0
- /* 本来は必要だがこれを有効にすると実機で通信できなくなってしまう
- * パケットが連続で出力される際にCLOSEが呼ばれると,2発目が
- * うまく出ていかないようだ.
- */
if (ret) send_close(number);
-#endif
}
break;
}
以下は tcp.c の修正.セッションのクローズ時でなく,FINの送信時に
status を FINWAIT1 に遷移するように修正.
@@ -178,6 +178,10 @@
size = 1;
}
+ if ((tcphdr->flags & TCP_HEADER_FLAG_FINACK) == TCP_HEADER_FLAG_FINACK) {
+ con->status = TCP_CONNECTION_STATUS_FINWAIT1;
+ }
+
tcphdr->checksum = tcp_calc_pseudosum(con->src_ipaddr, con->dst_ipaddr,
IP_PROTOCOL_TCP, pkt->size);
tcphdr->checksum = ip_calc_checksum(pkt->size, tcphdr);
@@ -619,7 +623,9 @@
TCP_HEADER_FLAG_FINACK,
#endif
1460, 0, 0, 0, NULL);
+#if 0
con->status = TCP_CONNECTION_STATUS_FINWAIT1;
+#endif
break;
case TCP_CMD_RECV:
あとちなみに,H8移植編その2第5回から ソースコードはシミュレータ動作版だったり実機動作版だったりコロコロ 変わっているので注意. (その時々でコロコロ変わっているし,ブートローダーとOSで異なっていたりするので, 利用する場合には要確認)
シミュレータ対応版なのか実機動作版なのかは,ブートローダー/OSともに, Makefile を見ればわかる.以下のようにすると,実機動作版になる.
#CFLAGS += -g CFLAGS += -Os #CFLAGS += -O0 CFLAGS += -DKOZOS #CFLAGS += -DSIMULATOR以下のようにすると,シミュレータ動作版になる.
CFLAGS += -g #CFLAGS += -Os CFLAGS += -O0 CFLAGS += -DKOZOS CFLAGS += -DSIMULATOR