Mon 08/04, 2008

インターフェース誌 ColdFire 基板(3) [Electronics ]

SilentC はインタプリタ型の言語処理系で昔のパソコン BASIC のように OS としての役割も担っている。文法的には C のサブセットでコンソール入出力やソケット操作などの組込み関数が用意されており、BASIC と同じく簡単に使うことができる。組込み関数は C の標準的なものとは全く別物で説明に多少曖昧な箇所もあるが、そう数はないし、さして難しいものでもない。変数とメモリの扱いに注意するくらいだ。手始めに単純な HTTP クライアントを書いてみた。

char *Serv="hostname";
char SendStr(char s,char *b){
  if(Write(s,b,StrLen(b))<0)return -2;
  WaitWriteComplete(s);return 0;
}
main(){char soc,stat;
  char *p;
  soc=CreateSocket(1);
  if(soc<0){PrStr("Soc?");return;}
  PrStr("Connect HTTP server\r\n");
  if(Connect(soc,GetHostByName(Serv),80)<0){PrStr("server?");return;}
  PrStr("GET request\r\n");
  SendStr(soc, "GET / HTTP/1.0\n\n");
  for(;;){
    if(Read(soc,100)<0)break;
    p=GetReceiveBuffer(soc,1);
    if(!p)next;
    PrStr(p);    
    MemoryFree(p);
  }
  PrStr("Close\r\n");
  CloseSocket(soc);
}

最初の行の hostname は接続したいホスト名。SilentC で DNS サーバが適切に設定されている必要がある。"127.0.0.1" のような形式でも良い。

13 行目の SendStr 関数に渡す "GET / HTTP/1.0\n\n" で適当なリクエストを記述する。バーチャルホストが設定されているサーバに対しては "GET / HTTP/1.01.1\nHost: bird.dip.jp\n\n" のようにホスト名指定が必要なことがある。(Host: パラメータは HTTP/1.1 からのサポート)

ソケットからの読み取りには Read, GetReceiveBuffer を順に呼び、毎回 MemoryFree も呼ぶことに注意する。データがテキストのみで 1 行の最大長が決まっているのであれば GetNetLine のほうがバッファを再利用できて簡単だ。GetReceiveBuffer の第二引数を 0 として再利用できるかは未確認。

で、このプログラムを Main と言う名称で保存して実行すると次のような出力が得られる。これは当サイトへの接続例だ。 HTTP ヘッダも含めて素のデータが戻るから必要に応じて加工するなりご自由に。

$ telnet 192.168.1.100
Trying 192.168.1.100...
Connected to 192.168.1.100.
Escape character is '^]'.
SilentC (May 13 2008)
OK
run
Connect HTTP server
GET request
HTTP/1.1 200 OK
Date: Mon, 04 Aug 2008 07:16:18 GMT
Server: Apache/2.0.61 (Unix) mod_ssl/2.0.61 DAV/2 PHP/5.2.5 mod_perl/2.0.3 Perl/v5.8.8
Last-Modified: Sat, 08 Dec 2007 12:46:07 GMT
ETag: "1457e3-11e0-bf2d61c0"
Accept-Ranges: bytes
Content-Length: 4576
Connection: close
Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
<HTML lang="ja">
<head>
<title>bird.dip.jp</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<link rel="stylesheet" type="text/css" href="white.css">
<link rel="SHORTCUT ICON" href="/favicon.ico">
</head>

<body bgcolor="#FFFFFF">
    :
Close
OK

LCD をつないでニュース ticker にでもしてみようか。 その際にはサーバ側でテキストの前処理を済ませておくと楽だろう。

[2008.08.18 追記]
SilentC は C ライクだけれども、色々と癖があるようだ。本誌の解説の他、サイレントシステム社のサイトにある OS-1 のプログラミングマニュアルが参考になるが、解説は微妙に物足りない。そういえば StrChr 関数はドキュメントととは違って、ポインタを返すようだ。

[2008.09.10 追記]
調子が悪いときは適当に SystemSleep() を挟むなどする。

Posted by masato at 07:15 PM
このエントリーのトラックバックURL: http://bird.dip.jp/cgi-bin/mt/mt-tb.cgi/1612
Trackbacks

外部ネットワークのIPアドレスはARPテーブル登録されるか
ARPテーブルには、外部ネットワークのIPアドレスも並ぶのか、調べました。

From 新適当マイコン電子工作研究所 at 10/09, 2008 10:55 PM
コメント

これは便利ですねー。
サイレントさんがPOP,SMTP等のクライアントを準備してくださ
っているので、これでめぼしい関数がそろいますね(^_^)
ニュース ticker にするにはRSSをフィードするのが便利そう。

Posted by: たけまろ at 08/04, 2008 08:54 PM

たけまろさん、コメントありがとうございます。

RSS でも HTML でも SilentC で処理するのは面倒なので、中継サーバで処理してしまおうかと考えてます。
SilentC 側では HTTP ヘッダを削除するだけ。でも、そこまでするなら HTTP で無くともいいんですがね。

Posted by: masato at 08/04, 2008 09:22 PM
コメントする

おそらく携帯電話等からは投稿できません。日本語文字列を含まないコメントやトラックバック、および当サイトへの言及を含まないトラックバックは御遠慮いただいております。また、90日以上経過した記事へのコメントはできません。










名前、アドレスを登録しますか?