<function>
<fname>new_connection</fname>
<prototype>
STREAM *
new_connection(
	char	* hostname,
	int	ip,
	short	port,
	int	(*func)( ),
	void	* work
);
</prototype>
<explanation>
<pre>
	homename	: 接続先サーバ名
	ip		: 接続先サーバアドレス（homename=0 のときのみ有効）
	port		: 接続先ポート
	func		: ギャーベージコレクション対応関数
	work		: ギャーベージコレクションワークエリア
</pre>
接続先サーバを与えて、TCPコネクションを張る。
</explanation>
<return>
接続に失敗すると、-1,成功すると、サーバとのストリームのディスクリプタを返す。
</return>

<details>
homenameを指定すると、指定されたサーバのportへつながる。homename=0とすると、ipに指定されたipアドレスのサーバに接続される。

接続に時間がかかっているときにかかる、ギャーベージコレクション要求に対応する必要がある。要求の対応処理を行う関数と、対応処理に必要なワークエリアをnew_connectionを呼び出す側が用意し、それぞれ、func,workにセットする。new_connectionはしかるべき時にこの関数を呼び出せばよい。

長くかかる可能性がある処理の両側を以下のように囲って下さい。
<pre>
	if ( func )
		(*func)(0,work);

	[長くかかる処理。]

	if ( func )
		(*func)(1,work);
</pre>
このようにすれば、[長くかかる処理]の間で、ギャーベージコレクション要求が発生した場合に対応が可能になります。
</details>
<history>
<renew "02/4/12">
最後のconnectシステムコールを呼んでいるところで、if(errno == EINTR)でリトライするコードが抜けていました。ごくまれに、インタラプトが掛かり、エラーリターンしてしまいます。Windows/Macではシグナルの扱いがUNIXとは異なっていると思いますが、この点も注意してください。
<renew "02/11/07">
UNIX の機種依存部分の関数、src/machine/std/net/client/connection.c におけるnew_connection にて、EISCONN (すでにコネクションが張られている)というエラーが返ることが分かったので、この場合、問題ないということで、先へ処理を進めるように変更しました。このエラーが発生する原因は、connect にて、EINTRの発生が、SolarisのOSのなかで、不可分処理になっていないためと思われます。
</history>
</function>
