• 締切済み

Java(クライアント)とC言語(サーバ)間のソケット通信 サーバ再起動時のbindエラー

サーバ側がC言語(Linux)、クライアント側がJavaのソケット通信プログラムを書いているのですが、いきなりつまづいてしまったため質問失礼します。 ソースとしては以下の2つのソースをテストとして利用させて頂きました。 ローカルネットワーク内の2台にそれぞれを設置し、それにあわせてIPとポートは変更してあります。 http://www.aihara.co.jp/~junt/program/socket/inet_server.c http://www.hellohiro.com/src/HelloWorldSocketClient.java サーバプログラムを少し変更し(http://oshiete1.goo.ne.jp/qa5565926.html)、サーバ起動→クライアント起動でサーバクライアント間通信を行えることを確認しました。 しかし、もう一度テストしてみようと直後にサーバプログラムを起動すると、bindでエラーを吐いてしまい接続待機状態にできませんでした。 少し待ってから起動したりポートを変えて実行すると正常に待機状態にできるため、プログラム終了時のソケットのクロージングが正常に行われずポートの競合が起きていることが原因だとは思うのですが、ソケットのcloseはサーバもクライアントも書いてあるため自分には解決方法が思いつきませんでした。 ちなみに、サーバプログラムのソースと併せて公開されているC言語クライアントプログラムを用いた場合は再起動してもbindエラーが出ることはありませんでした。 この問題の原因と考えられることと解決案をアドバイス願えませんでしょうか。よろしくお願いします。 以下、開発環境です。 ■C言語 OS:Fedora 12 エディタ:一応VisualC++2008(Linux用に書いているので実質ただのテキストエディタ) コンパイラ:標準gcc ■Java OS:Windows XP SP3 エディタ・コンパイラ:eclipse ※実装先の都合上、winsockによるサーバに変えるや言語の変更はできません。

みんなの回答

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

man page によると、 > SO_REUSEADDR > bind(2) コールに与えられたアドレスが正しいかを判断するルールで、ローカ > ルアドレスの再利用を可能にする。つまり AF_INET ソケットなら、そのアドレ > スにバインドされたアクティブな listen 状態のソケットが存在しない限り、 > バインドが行える。 listen 状態のソケットがアドレス INADDR_ANY で特定の > ポートにバインドされている場合には、このポートに対しては、どんなローカ > ルアドレスでもバインドできない。引き数はブール整数のフラグである。 との事ですから、これが原因かと疑われるます。 inet_server.c を見たところ、SO_REUSEADDR を設定しているところも見当たりませんし。 以下のページが参考になるかと思います。 man page - getsockopt, setsockopt http://www.linux.or.jp/JM/html/LDP_man-pages/man2/getsockopt.2.html man page - socket - SO_REUSEADDR http://www.linux.or.jp/JM/html/LDP_man-pages/man7/socket.7.html

関連するQ&A