NetServer with uIP
NetServerを経由してのパケットの送信です。
uIP上でのパケット送信には2種類あって
- パケット受信ループからそのコネクションに対してパケット送信
- コネクションをオープンして送信
前者の場合はWebサーバーが動いたときに検証済みだったのですが、後者を今日試してみたところ動きませんでした。
http://www.sics.se/~adam/uip/uip-0.9-refman/main.htmlにあるドキュメントによれば、
u16_t ipaddr[2]; uip_ipaddr(ipaddr, 192,168,0,1); uip_connect(ipaddr, HTONS(80));
のように接続しておいて、アプリケーションのイベントループで
if(uip_connected() || uip_rexmit()) { uip_send((volatile u8_t*)"GET /file HTTP/1.0\r\nServer:192.168.100.2\r\n\r\n", 48);
このように接続が確立された状態であるときにuip_sendすればよいことになっています。
これをやってみたのですがぜんぜん動かなくてソースをいろいろいじって見て分かりました。
main.cでメインループがあり、ループの一番最初にデバイスからreadしています。
while(1) { uip_len = pcapdev_read();
そしてそこのコメントをちゃんと読むと
/* Let the pcapdev network device driver read an entire IP packet
into the uip_buf. If it must wait for more than 0.5 seconds, it
will return with the return value 0. If so, we know that it is
time to call upon the uip_periodic(). Otherwise, the pcapdev has
received an IP packet that is to be processed by uIP. */
今見れば、一目瞭然なのですが、pcapdev_readがデータ受信するまでブロックしていたらその先に行かない・・・orz
というわけでWinPcapを利用してタイムアウトつきで受信するように変えなければいけないようです。
今日はここまで
全然関係ないですが、乱高下は、「らんこうげ」と読むんですね。
この言葉を人生で口に出していったことがなかったからセーフですが「らんこうか」だと思ってました。