• ベストアンサー

tcpを使った カウンタプログラム

tatsu99の回答

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.5

>デーモンで接続を受けた場合には、 bind のエラーが出力されました。 bindの戻り値 及びそのときのerrnoを提示してください。 errnoにはbindエラーの理由が設定されているはずです。 又、どのようにして「デーモンで接続を受けた場合」を実現したのでしょうか。そのときのスクリプトも提示してください。 本件とは、関係ありませんが、 string = (char *)calloc(BUF_LEN, sizeof(char)); で確保したメモリを解放していません。もし、デーモンで正常に動作するようになると、次に、これが原因で、メモリの枯渇が発生します。必ず、解放するか、 char string[BUF_LEN]; memset(string,0x00,sizeof(string)); のようにして、メモリをアロケートしないことをすすめます。

user_localhost
質問者

お礼

回答をくださり、ありがとうございます。 手直ししたファイルをアップしました。 変更点は、 ・システムエラーメッセージを標準出力ではなく、ファイルへ出力した点。 ・printf() の内容を fputs() に変更し、標準出力への情報をファイルへ出力させた点。 ・文字列用の動的に確保したメモリ領域をmain() の最後で開放した点。 です。 bindのエラーは、xinetd のデーモンで実行した場合、システムエラーメッセージをファイル(sample.txt)へ出力すると、 Address already in use と出力されました。 これは、既に使用されているポートを使用してプログラムを実行させた場合に出力されるものだと思います。 つまり、これが出力されるということは、xinetd で監視してサーバープログラムを走らせると、既に5000板ポートを使っている状態でプログラムが実行されるので、このような問題が起こるのではないかと、推理できます。 そうなると、xinetd の設定の問題なのでしょうか。 /etc/xinetd.d/ 以下の設定ファイル(/etc/xinetd.d/tcp_server)の中身を記載させていただきます。 service tcp_server { disable = no flags = REUSE socket_type = stream wait = no user = root server = /home/gakusei/programming/usb/test/sample03/secondserver log_on_failure += USERID } 又、以下に /etc/xinetd.conf の内容も記載させていただきます。 defaults { instances = 60 log_type = SYSLOG authpriv log_on_success = HOST PID log_on_failure = HOST cps = 25 30 } includedir /etc/xinetd.d 更に、/etc/services には、以下のような内容を追記しました。 tcp_server 5000/tcp 以上のように設定し、xinetd を再起動させ、スタンドアローン時と同様に5000番ポートを使用してクライアントプログラムを実行させ、サーバープログラムへ接続要求を行いました。 手間をかけさせてしまい、申し訳ありません。 御回答のほど、よろしくお願い致します。

user_localhost
質問者

補足

/etc/xinetd.d/tcp_server のサーバープログラムに ..../sample03/secondserver と書きましたが、内容はオリジナルの質問のソースが置いてあるURLのserver.c をコンパイル/リンクしたものです。

関連するQ&A

  • TCPによるファイル転送

    質問です。よろしくお願いします。 いま、winsockでクライアントからサーバにバイナリファイルを転送するプログラムを組んでいます。内容は、サーバ側を待機の状態にし、クライアントからの要求があった時点で新たにソケットを作ってそこからデータのやり取りをするというものです。 しかし、ソケットを使った通信がサーバからクライアントの一方通行になってしまっていて、データを送ることが出来ません。(クライアントから送ったデータは0になっているようにも思われます) ソケットは一方通行なのでしょうか?参考にしている本のサンプルではお互いにやり取りをしていたと思うので、そのようなことはないと思うのですが・・・。 内容分かりにくければご質問ください。 回答お待ちしています。

  • [UNIX]NFSクライアントでのrpcbind起動の意味

    いつも勉強させてもらっております。 HP-UX(UNIX)について質問させてください。 NFS(Network File System)についてになります。 NFSにはサーバとクライアントという役割が二つ存在しますが、 サーバ側には、NFSサーバデーモンを起動させると、「rpcbind」というポート111を空けてクライアントからの要求を待ちうけ、要求に応じたプログラムを実行させるデーモンがあがります。 一方、クライアント側でも、NFSクライアントデーモンを起動させると、同じく「rpcbind」が起動されます。 クライアント側でのrpcbindが起動する理由とはなんなのでしょうか。

  • TCP通信

    OS:Win2000、VisualBasic.netで開発しています。 現在TCP通信のプログラムを製造しています。 TCPサーバとTCPクライアントのテストアプリケーションを作成し、接続テストを行っているのですが、 サーバとクライアントの接続、データ送受信の確認はできました。 しかし、一度クライアント側から接続を切断(ソケットを消去)し、 再びソケットを生成してコネクト要求を出しても接続が確立できません。 このときサーバ側はなにも操作していません。 終始接続待機状態にしてあります。 ソースがないと分かりにくいかもしれませんが、 何か思い当たることがある方、アドバイスよろしくお願いします。

  • サーバプログラム

    C言語の初心者です。 OS : CentOS 5.3 c言語でサーバ用のプログラムを書きました。 ソケット通信で接続してきたクライアントにデータをそのまま返すと言うものです。 コンパイルしたソースが、 gcc -Wall -o example example.c だとすると、この exampleソースを サービスとして( 「デーモンとして」と言うのか? )、起動したい場合、 どのように起動すればよいのでしょうか? ./example と叩くだけだと、叩いた間だけしかプログラムは動いてくれませんよねぇ。 また、サーバプログラムの良書を教えていただけたら幸いです。 初歩的な事でしたら申し訳ないですが、 よろしくお願いします。

  • TCPサーバ bind関数のエラーについて

    簡易TCPサーバをC言語で構築しています。 サーバ側のプログラムを実行し、クライアントから要求があった(GET / HTTP/1.0)場合に文字列をクライアント側に送信します。テスト一回目は要求通りの機能を果たし無事に終了できました。しかし、1回目と同じように2回目も実行すると、bind()関数でエラーが出ます。自分では一回目の接続で使ったポートが使用され続けてしまっているので、2回目の接続が前の接続に阻まれている(?)のが原因では無いかと思うのですが、これは何が原因なのでしょうか。いくら考えても分かりません。教えて下さい。

  • サーバプログラム

    ネットワークアプリケーションとして、 複数のクライアントから接続要求を受け付けるサーバプログラムには どんなものがありますか? よろしくお願いします。

  • Javaプログラム同士のプロセス間通信について

    Java初心者です。 デーモン化したJavaプログラムとJavaサーブレット間のプロセス間通信を 行いたいと思っていますがどのようにしたものか悩み中です。 ○デーモン化したJavaプログラムは、 1、あるポートからSocket通信でデータを受信し、受信したデータをDBに格納する 2、クライアントからの要求で1で保存したデータを加工して送信 ○サーブレットプログラムでは、 上記のデーモン化プログラムの設定等をブラウザ上から変更できるようにしたいと考えています。 設定とは、例えば受信したデータを全てDBに保存せずに ブラウザから条件を設定できてフィルターするような動作に変更できたり、 また、デーモン化プログラムの動作をブラウザ上から停止、開始できるようにしたいのです。 上記の様な構成の場合にプロセス間通信をする必要があると思いますが、 どの様なプロセス間通信を使えばいいのか悩んでいます。 ほんとうは上記の様な2つのプログラムを1つのプログラムで出来ればいいなぁ~と考えているのですが、、 実現方法が判りません。。 なにか名案はございませんでしょうか? わかりづらい説明でもうしわけございません。 参考になるかわかりませんが、イメージ図を、 <イメージ図> デ  data   開  data    ク ー --------> 発 -------->  ラ タ        中         イ 鯖        鯖         アント          ↑          |          |設定変更          |       管          └--------- 理                   者 よろしくおねがいします。

    • ベストアンサー
    • Java
  • Daemonの由来、語源とは??

    サーバがクライアントからの要求をまつプロセスを「デーモン」と言いますが、これがなぜ、デーモンと呼ばれているんでしょうか。どなたか語源について御存知な方はいらっしゃいませんでしょうか。そして、その語源からデーモンの役割とのつながりを御教授宜しく御願いします。

  • TCPクライアントサーバプログラムで受信したデータを処理するには?

    javaのTCPのクライアントサーバのプログラムでよく見かけると思いますが、データをクライアントもしくはサーバから受け取ったとき、それを表示させるには  cont = true ; while (cont) { try { // 読み込み (サーバorクライアントからのデータ) int n = instr.read(buff); // System.outへの書き出し System.out.write(buff, 0, n) ;                  //↑このデータを使いたい↑ } // 以下は例外処理です catch(Exception e){ // 読み出し終了時にループも終了します cont = false ; } という風にすればできるのですが、読み込んだデータを利用して処理(具体的には文字列(String)として処理したい)するにはどうすればいいのでしょうか? プログラミングに詳しい方教えて頂けないでしょうか?

  • ConnectNamedPipeの接続待ち

    はじめまして。 名前付きパイプを用いた、 サーバ側、クライアント側のプログラムを作成しています。 開発言語はVB6.0です。 サーバ、クライアント間の接続、データの送受信など、 ある程度のことは出来るようになったのですが、ひとつ問題が発生しました。 現在、サーバ・クライアント間の接続には、 サーバ側でConnectNamedPipe関数により、クライアント側の接続を待機し、 クライアント側でCreateFile関数で接続する、という方法を取っています。 この方法で一応接続は上手くいっているのですが、 サーバ側で、クライアント側の接続を待機した状態で、 クライアント側からの接続が行われない場合、 サーバ側のプログラムはConnectNamedPipe関数で、 いつまでも待機状態になってしまい、プログラムを終了することが出来ません。 そこで、ConnectNamedPipe関数の接続待ちにタイムアウト時間を設定する、 もしくは手動でキャンセルする、ということを行いたいのですが、 良い方法が見つかりません。 どなたか分かる方いましたらご解答宜しくお願いします。