Tech Note 18: TcpIpLib 2.1 共有ライブラリを使う

April 23, 2002

© NS BASIC Corporation. All rights reserved.


[英語版]  

Contents

    はじめに
    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接続を使用します。


1. メソッド

Version()

バージョン番号を返す。

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


TcpClose(fd)

接続fdを閉じる。



data = TcpRead(fd, count, matchset, timeout)

開いている接続からデータを読む。

' 100文字受け取った時点、
' # か > がストリーム中に見つかった時点、
' または、2.5秒が過ぎた時点か接続が閉じた時に戻される。
timeout = 2500
toread = 100
data = TcpRead(fd, toread, "#>", timeout) 


written = TcpWrite(fd, data)

開いている接続にデータの書き込み。書かれた文字数を返す。エラーの場合、writtenが負数になる。エラーコードは付録 Bを参照。

bytes=TcpWrite(fd, data)


TcpFlush(fd)

入力バッファーをフラッシュ。

TcpFlush()

2. TcpIpLibを使ってデスクトップと通信

デスクトップ上で動作するVBプログラムとのデータの送受信は簡単です。ホスト名(hostname)はデスクトップマシンのIPアドレスを使い、両サイドのプログラムにコードしているポート番号(port)を使います。コマンドの送受信と、データの通信を行いましょう。

では以下のようにサンプルプログラムを実行してみましょう。

  1. 上記ファイルをインストール
  2. NS BasicからTCP2VBをコンパイル、ダウンロード、実行。これはデスクトップにつながっているTCP/IPが利用可能なデバイスか、直接POSEから実行可能。 <>I>プログラムを実行
  3. デスクトップのIPアドレスを入力。アドレスが分からない場合、デスクトップ上でStart...Run。CMDを入力してDOSシェルを立ち上げた後、ipconfigをタイプするとIPアドレスが見れます。
  4. デスクトップ上でvbTcpIp.exeを実行。
  5. デバイス上でConnectをタップし、接続を確立する。
  6. Sendフィールドにテキストを入力。
  7. Sendボタンをタップする。
  8. デスクトップで動作中のvbTcpIpプログラムにタイプしたテキストが現れます。
  9. vbTcpIpプログラムは次にこのテキストメッセージをデバイスに送り返します。
デバイスのReceived Dataフィールドにテキストが現れたら、1往復の通信が達成したことになります。

3. 標準インターネットプロトコル

以下はネットで最も一般的に使われているプロトコルのいくつかを非常に簡単に説明しています。各説明の頭に関連するRFCへのリンクを付けていますので、詳細はそちらをご覧下さい。(RFC(Request for Comment)はインターネットがどう動くのかをドキュメントにしてあります。ここでは、すべて英語版ですが、中には日本語版も用意されているかもしれません。)

全てのRFCドキュメントへの索引はhttp://www.faqs.org/rfcs/です。

3.1 ウェブページを読む: http

(詳細はRFC2616を参照)

ウェブサーバに接続するために、例えばアドレスに"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

サンプルのTcpIpDemo.prjを参照して下さい。

3.2 ニューズグループを読む: nntp

(詳細は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 (".").

サンプルのTcpIpDemo.prjを参照して下さい。

3.3 メールを送る: smtp

(詳細は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.

サンプルのTcpIpDemo.prjを参照して下さい。

3.4 メールを受け取る: pop3

(詳細は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を参照して下さい。


4. ソースコードをコンパイル

ダウンロードしたものに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へお送り下さい。彼が含めるかどうかを判断します。


付録 A: 一般ポート番号表

各ポート番号がサポートするコマンドを得るには、関連するRFC資料を参考にして下さい。RFC資料の一覧はhttp://www.faqs.org/rfcs/です。

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
 

付録 B: Palm OS ネットエラーメッセージ

TcpIpLibの関数のいくつかは数値を返します。それが負数の場合、その関数コールはエラーを意味します。以下の表は各エラー番号を説明しています。(番号は正数にしてあります)
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