TIME_WAIT状態に関して

 サーバのプログラムでAddress already in useのエラーが発生する原因は、サーバがTIME_WAIT状態になっている、一時的に利用不可能なポート番号を利用しようとしているからである。

 TIME_WAIT状態は、サーバ側でプロセス終了後に別プロセスが同一のポート番号を利用しないようにするのが目的である。仮にサーバのプロセス終了後に、同一ポート番号を別プロセスが即時に利用した場合には、クライアント側からネットワーク上で遅れていたパケットが、この時間内に到着し、「混入」してしまう可能性がある。
 
 そのためTIME_WAIT状態は、サーバ側からクライアントに対してセッションを切断した場合(アクティブクローズ)の場合に発生する。サーバ側から切断した場合には、クライアントから遅れてパケットが届く可能性があるからである。

 逆にクライアント側からセッションを切断した場合(パッシブクローズ)には、当然クライアントから遅れていたパケットがくることはないため発生しない。

 Linuxではデフォルトでは60秒らしい。

要するに

 クライアントがらセッションを切断するのではなく、サーバ側からセッションを切断すると発生する。サーバ側から切断するようなイレギュラーな操作をしなければ発生しない。