Tech Note 18: TcpIpLib 2.1 共有ライブラリを使う April 23, 2002 © NS BASIC Corporation. All rights reserved. |
はじめに 1. メソッド 2. TcpIpLibを使ってデスクトップと通信 3. 標準インターネットプロトコル 3.1 ウェブページを読む: http 3.2 ニューズグループを読む: nntp 3.3 メールを送る: smtp 3.4 メールを受け取る: pop3 4. ソースコードをコンパイル 付録 A: 一般ポート番号表 付録 B: Palm OS ネットエラーメッセージ
この共有ライブラリの初期版はFloyd Worley氏によって書かれ、バージョン2.1はMatthijs van Duin氏によって書かれました。お気付きの点はnipponsupport© nsbasic.comへお知らせ下さい。
TcpIpLibはTcp/IPを使ってPalmから通信が行える、使い易い共有ライブラリです。ウェブページを読むものや、VisualBasicで書かれたデスクトッププログラムと通信するサンプルを用意してあります。
ライブラリおよびサンプルはここからダウンロードできます。 以下のファイルが含まれています:
ネットに対応しているPalmOSデバイス上でサンプルは実行可能です。プログラムを実行する前にNSBRuntimeおよびTCPIPLIBをインストールすることを忘れないで下さい。
TCP/IPプログラムをテストする最も簡単な方法はPOSEを使うことです。POSEのPropertiesで"Redirect NetLib calls to host TCP/IP"をセットして下さい。これによって貴方のプログラムが発する呼び出しは、デスクトップコンピュータのTCP/IP接続を使用します。
バージョン番号を返す。
fd = TcpOpen(hostname, port, timeout)
hostnameの指定portを開く。開けなかった場合、負数がfdに返される。一般ポート番号は付録 Aを参照。エラーコードは付録 Bを参照。
例
fd = TcpOpen("www.nsbasic.com", 80, 5000) If fd < 0 Then msgbox "open error " + str(-fd) ' Palm error code end if
接続fdを閉じる。
開いている接続からデータを読む。
例
' 100文字受け取った時点、 ' # か > がストリーム中に見つかった時点、 ' または、2.5秒が過ぎた時点か接続が閉じた時に戻される。 timeout = 2500 toread = 100 data = TcpRead(fd, toread, "#>", timeout)
開いている接続にデータの書き込み。書かれた文字数を返す。エラーの場合、writtenが負数になる。エラーコードは付録 Bを参照。
例
bytes=TcpWrite(fd, data)
入力バッファーをフラッシュ。
例
TcpFlush()
デスクトップ上で動作するVBプログラムとのデータの送受信は簡単です。ホスト名(hostname)はデスクトップマシンのIPアドレスを使い、両サイドのプログラムにコードしているポート番号(port)を使います。コマンドの送受信と、データの通信を行いましょう。
では以下のようにサンプルプログラムを実行してみましょう。
以下はネットで最も一般的に使われているプロトコルのいくつかを非常に簡単に説明しています。各説明の頭に関連するRFCへのリンクを付けていますので、詳細はそちらをご覧下さい。(RFC(Request for Comment)はインターネットがどう動くのかをドキュメントにしてあります。ここでは、すべて英語版ですが、中には日本語版も用意されているかもしれません。)
全てのRFCドキュメントへの索引はhttp://www.faqs.org/rfcs/です。
ウェブサーバに接続するために、例えばアドレスに"www.nsbasic.com"を、ポート番号に80を使います。(アドレスはアクセスしたい場所によって異なります。ポート番号は常に80です。一般ポート番号は付録 Aを参照。
ウェブページをロードするには、
GET /testdata.txt HTTP:/1.0 Host: www.nsbasic.com:80
データが戻ってきて、接続が閉じます。NewsラインはCR/LFで終わっていますが、返されるウェブ情報はLFだけかもしれません。1ページのデータを受けたところで、サーバは接続を閉じます。従ってページが完全に受け取れているかを見るのには、接続が終了するのを待って下さい。
あるウェブサイトはCGIと呼ばれるプログラムを実行します。例えば、www.dbc.comへ接続し、以下のコマンドを使って下さい:
GET /cgibin/htx.exe/squote?TICKER=DOCSF
(詳細はRFC977を参照)
ニュースに接続するには、"nntp.netcruiser"等のアドレスと、ポート番号119を使います。(アドレスはアクセスしたい場所によって異なります。ポート番号は常に119です。一般ポート番号は付録 Aを参照。
最初に以下のようなウエルカム・メッセージをもらいます:
"200 tor-nn1.netcom.ca InterNetNews NNRP server INN 1.4unoff4 05-Mar-96 ready (posting ok)."
次にどのニューズグループが欲しいかを伝えます:
group alt.food.wine
このように戻ってきます:
211 206 16868 17075 alt.food.wine
これは16868から17075までの206個の記事があるという意味です。
いくつかの記事のヘッダーを読む場合、以下を送ります:
xover 17000-17005
するとこのように受け取ります:
"17070 Re: Old Liebfraumich... "Roger L. Lustig" Wed, 31 Jul 1996 22:51:21 -0400 <32001BA9.367© ix.netcom.com> <4tnroe$m9m© mcmail.CIS.McMaster.CA> 1092 14" "17071 Re: Wine de Constantia, info needed "Roger L. Lustig" Wed, 31 Jul 1996 22:54:37 -0400 <32001C6D.76ED© ix.netcom.com> 1590 31" "17072 Napa Crush Begins "Brian Boulden" 1 Aug 1996 04:50:45 GMT <01bb7f64$195b6da0$a677ae8c© boulden.community.net> 1523 22" "17073 Re: Alsace zincats© aol.com (ZinCats) 1 Aug 1996 01:00:41 -0400 <4tpdlp$m8i© newsbf02.news.aol.com> <31FD65C5.4774© widomaker.com> 992 8" "17074 Re: Oregon Bound - Need Help zincats© aol.com (ZinCats) 1 Aug 1996 01:14:38 -0400 <4tpefu$mog© newsbf02.news.aol.com> <31FAFB21.2052© execpc.com> 793 5" "17075 RE: Old Liebfraumich... chris.anderson© dinosaur.com Wed, 31 Jul 96 23:06:55 -0700 <9607312306.0WH1U00© dinosaur.com> <4tnroe$m9m© mcmail.CIS.McMaster.CA> 1317 18"
1つの記事を読むには、以下の様に送ります:
article 17000
記事は長さがそれぞれ異なりますが、ピリオド(".")のみを含んだラインで終わります。 Articles may be any number of lines long, terminated by a final line that consists of a period by itself (".").
(詳細はRFC2821を参照)
最も良く使われているメールを送るプログラムはSMTPで、時にsendmailと呼ばれます。
SMTPサーバに接続するには、"netcom.ca"などのアドレスとポート番号25を使います。(アドレスはアクセスしたい場所によって異なります。ポート番号は常に25です。一般ポート番号は付録 Aを参照。
これがどう動くかを見せるために、NS Basicプログラムから、telnet経由でsmtpサーバに接続し、コマンドを直接タイプします。以下のステップを真似してみて下さい。U:で始まるラインがユーザがタイプする内容です。
U: telnet netcom.ca 25 Trying 207.93.1.148... Connected to netcom.ca. Escape character is '^]'. 220 tor-srs1.netcom.ca ESMTP Sendmail 8.7.5/SMI-4.1/Netcom ready at Tue, 27 Aug 1996 15:23:06 -0400 (EDT) U: HELO io.com 250 tor-srs1.netcom.ca Hello nsbasic© pentagon.io.com [199.170.88.5], pleased to meet you U: MAIL FROM: gh© nsbasic.com 250 gh© nsbasic.com... Sender ok U: RCPT TO: gh© nsbasic.com 250 Recipient ok U: DATA 354 Enter mail, end with "." on a line by itself U: SUBJECT: This is some test data U: This is line 1 of my message U: and line 2. U: . 250 PAA16699 Message accepted for delivery U: QUIT 221 tor-srs1.netcom.ca closing connection Connection closed by foreign host.
(詳細はRFC1939を参照)
最も良く使われているメールを受け取るプログラムはPOP3です。
POP3サーバに接続するには、"netcom.ca"などのアドレスとポート番号110を使います。(アドレスはアクセスしたい場所によって異なります。ポート番号は常に110です。一般ポート番号は付録 Aを参照。
これがどう動くかを見せるために、NS Basicプログラムから、telnet経由でPOP3サーバに接続し、コマンドを直接タイプします。以下のステップを真似してみて下さい。U:で始まるラインがユーザがタイプする内容です。
U: telnet netcom.ca 110 Trying 207.93.1.148... Connected to netcom.ca. Escape character is '^]'. +OK NETCOM v0.1 at tor-srs1 starting : built on Aug 2 1996 14:00:08. U: user ghenne +OK Password required for ghenne. U: PASS xxxxxx +OK ghenne has 0 message(s) (0 octets). U: STAT +OK 3 1766 U: DELE 3 +OK Message 3 has been deleted. U: LIST +OK 2 messages (1425 octets) 1 801 2 624 . U: DELE 2 +OK Message 2 has been deleted. U: RETR 1 +OK 801 octets Return-Path: Received: from deliverator.io.com by tor-srs1.netcom.ca (8.7.5/SMI-4.1/Netcom) id PAA17679; Tue, 27 Aug 1996 15:28:22 -0400 (EDT) From: gh© nsbasic.com Received: from tor-srs1.netcom.ca (tor-srs1.netcom.ca [207.93.1.148]) by deliverator.io.com (8.7.5/8.7.3) with ESMTP id OAA16463 for ; Tue, 27 Aug 1996 14:24:42 -0500 (CDT) Received: from pentagon.io.com by tor-srs1.netcom.ca (8.7.5/SMI-4.1/Netcom) id PAA16699; Tue, 27 Aug 1996 15:23:18 -0400 (EDT) Date: Tue, 27 Aug 1996 15:23:18 -0400 (EDT) Message-Id: <199608271923.PAA16699© tor-srs1.netcom.ca> This is line 1 of my message and line 2. . U: QUIT +OK Pop server at signing off. Connection closed by foreign host.
サンプルのTcpIpDemo.prjを参照して下さい。
ダウンロードしたものにTcpIpLibのソースコードが含まれています。PRC-Toolsを使うことによってコンパイルできます。
PRC-ToolsはPalm OSアプリケーションをCまたはC++で構築するための完全なコンパイラーツールです。PRC-ToolsパッケージはパッチバージョンのGNU GCC、binutils、GDBおよび様々なpost-linkerツールが含まれています。PRC-ToolsのPalm OS特有のパーツは、元々D. Jeff DionneおよびKresten Krab Thourpによって書かれ、現在はJohn Marshallによって管理されています。また、多くの人が何年渡って貢献しています。このツールは無償です。最新版およびインストールマニュアルはPRC-Tools ページから入手可能です。PalmSourceもPRC-Tools ページを持っています。
TcpIpLibは共有ライブラリです。NS Basicと共有ライブラリの詳細はTech Note 5をご覧下さい。
TcpIpLibをご自身の目的のために変更する場合は、名前及びCreator IDを変更することを忘れないで下さい。他の人が使った場合にオリジナルのTcpIpLibとの衝突が避けるためです。
オリジナルのTcpIpLibに変更を提案する場合はFokko van Duinへお送り下さい。彼が含めるかどうかを判断します。
tcpmux 1/tcp # TCP port multiplexer (RFC1078) echo 7/tcp echo 7/udp discard 9/tcp sink null discard 9/udp sink null systat 11/tcp users daytime 13/tcp daytime 13/udp netstat 15/tcp qotd 17/tcp quote chargen 19/tcp ttytst source chargen 19/udp ttytst source ftp 21/tcp telnet 23/tcp smtp 25/tcp mail time 37/tcp timserver time 37/udp timserver rlp 39/udp resource # resource location nameserver 42/tcp name # IEN 116 whois 43/tcp nicname domain 53/tcp nameserver # name-domain server domain 53/udp nameserver mtp 57/tcp # deprecated bootps 67/udp bootp # bootp server bootpc 68/udp # bootp client tftp 69/udp gopher 70/tcp rje 77/tcp netrjs finger 79/tcp link 87/tcp ttylink http 80/tcp supdup 95/tcp hostnames 101/tcp hostname # usually from sri-nic tsap 102/tcp # part of ISODE. pop2 109/tcp # old pop port pop 110/tcp pop3 postoffice sunrpc 111/tcp sunrpc 111/udp ident 113/tcp auth tap authentication sftp 115/tcp uucp-path 117/tcp nntp 119/tcp read news untp # USENET News Transfer Protocol ntp 123/udp ntpd imap 143/tcp snmp 161/udp # network time protocol snmp-trap 162/udp smux 199/tcp
4609 | netErrAlreadyOpen |
4610 | netErrNotOpen |
4611 | netErrStillOpen |
4612 | netErrParamErr |
4613 | netErrNoMoreSockets |
4614 | netErrOutOfResources |
4615 | netErrOutOfMemory |
4616 | netErrSocketNotOpen |
4617 | netErrSocketBusy |
4618 | netErrMessageTooBig |
4619 | netErrSocketNotConnected |
4620 | netErrNoInterfaces |
4621 | netErrBufTooSmall |
4622 | netErrUnimplemented |
4623 | netErrPortInUse |
4624 | netErrQuietTimeNotElapsed |
4625 | netErrInternal |
4626 | netErrTimeout |
4627 | netErrSocketAlreadyConnected |
4628 | netErrSocketClosedByRemote |
4629 | netErrOutOfCmdBlocks |
4630 | netErrWrongSocketType |
4631 | netErrSocketNotListening |
4632 | netErrUnknownSetting |
4633 | netErrInvalidSettingSize |
4634 | netErrPrefNotFound |
4635 | netErrInvalidInterface |
4636 | netErrInterfaceNotFound |
4637 | netErrTooManyInterfaces |
4638 | netErrBufWrongSize |
4639 | netErrUserCancel |
4640 | netErrBadScript |
4641 | netErrNoSocket |
4642 | netErrSocketRcvBufFull |
4643 | netErrNoPendingConnect |
4644 | netErrUnexpectedCmd |
4645 | netErrNoTCB |
4646 | netErrNilRemoteWindowSize |
4647 | netErrNoTimerProc |
4648 | netErrSocketInputShutdown |
4649 | netErrCmdBlockNotCheckedOut |
4650 | netErrCmdNotDone |
4651 | netErrUnknownProtocol |
4652 | netErrUnknownService |
4653 | netErrUnreachableDest |
4654 | netErrReadOnlySetting |
4655 | netErrWouldBlock |
4656 | netErrAlreadyInProgress |
4657 | netErrPPPTimeout |
4658 | netErrPPPBroughtDown |
4659 | netErrAuthFailure |
4660 | netErrPPPAddressRefused |
4661 | netErrDNSNameTooLong |
4662 | netErrDNSBadName |
4663 | netErrDNSBadArgs |
4664 | netErrDNSLabelTooLong |
4665 | netErrDNSAllocationFailure |
4666 | netErrDNSTimeout |
4667 | netErrDNSUnreachable |
4668 | netErrDNSFormat |
4669 | netErrDNSServerFailure |
4670 | netErrDNSNonexistantName |
4671 | netErrDNSNIY |
4672 | netErrDNSRefused |
4673 | netErrDNSImpossible |
4674 | netErrDNSNoRRS |
4675 | netErrDNSAborted |
4676 | netErrDNSBadProtocol |
4677 | netErrDNSTruncated |
4678 | netErrDNSNoRecursion |
4679 | netErrDNSIrrelevant |
4680 | netErrDNSNotInLocalCache |
4681 | netErrDNSNoPort |
4682 | netErrIPCantFragment |
4683 | netErrIPNoRoute |
4684 | netErrIPNoSrc |
4685 | netErrIPNoDst |
4686 | netErrIPktOverflow |
4687 | netErrTooManyTCPConnections |
4688 | netErrNoDNSServers |
4689 | netErrInterfaceDown |
4690 | netErrNoChannel |
4691 | netErrDieState |
4692 | netErrReturnedInMail |
4693 | netErrReturnedNoTransfer |
4694 | netErrReturnedIllegal |
4695 | netErrReturnedCongest |
4696 | netErrReturnedError |
4697 | netErrReturnedBusy |
4698 | netErrGMANState |
4699 | netErrQuitOnTxFail |
4700 | netErrFlexListFull |
4701 | netErrSenderMAN |
4702 | netErrIllegalType |
4703 | netErrIllegalState |
4704 | netErrIllegalFlags |
4705 | netErrIllegalSendlist |
4706 | netErrIllegalMPAKLength |
4707 | netErrIllegalAddressee |
4708 | netErrIllegalPacketClass |
4709 | netErrBufferLength |
4710 | netErrNiCdLowBattery |
4711 | netErrRFinterfaceFatal |
4712 | netErrIllegalLogout |
4713 | netErrAAARadioLoad |
4714 | netErrAntennaDown |
4715 | netErrNiCdCharging |
4716 | netErrAntennaWentDown |
4717 | netErrNotActivated |
4718 | netErrRadioTemp |
4719 | netErrNiCdChargeError |
4720 | netErrNiCdSag |
4721 | netErrNiCdChargeSuspend |
4722 | not used |
4723 | netErrConfigNotFound |
4724 | netErrConfigCantDelete |
4725 | netErrConfigTooMany |
4726 | netErrConfigBadName |
4727 | netErrConfigNotAlias |
4728 | netErrConfigCantPointToAlias |
4729 | netErrConfigEmpty |
4730 | netErrAlreadyOpenWithOtherConfig |
4731 | netErrConfigAliasErr |
4732 | netErrNoMultiPktAddr |
4733 | netErrOutOfPackets |
4734 | netErrMultiPktAddrReset |
4735 | netErrStaleMultiPktAddr |
4736 | netErrScptPluginMissing |
4737 | netErrScptPluginLaunchFail |
4738 | netErrScptPluginCmdFail |
4739 | netErrScptPluginInvalidCmd |
4740 | netErrTelMissingComponent |
4741 | netErrTelErrorNotHandled |