クライアント(Windows)とサーバ(Unix)の通信アプリを作っています。
ソケットプログラムはクライアント側はVBで、サーバ側はCです。
データの送受信はうまくいきました。ところが、データを送信後サーバ側でデータを解析し、その結果を印刷するというしくみなのですがこの全処理が終わらないとクライアント側に送信終了のイベントが発生しません。
クライアント側がデータを送信したら、あとはサーバ側で処理をする、というふうにしたいのです。

そこでサーバ側のアプリは次のような構造になっています。
App1(ソケットアプリ)
exec でApp2 を起動 App2(データの送受信)
wait あり exec でApp3 を起動 App3(データ解析)
             wait なし exec でApp4,App5 を起動
wait あり、sleep あり

App3以降で時間がとてもかかります。wait,sleep が入っているからですが、これはデータ解析する上で必要な手順です。データの送受信はApp2までで終わっているので、App3のプロセスを発行したらソケット切断にしたいのですが、App3が全て終わるまで待ってしまいます。
起動のさせ方でなんとかならないものかと思うのですが、どうぞアドバイスを宜しくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

全体の構造が詳しく分からないので、ひょっとすると見当違いかも知れませんが、私の経験から幾つかのアドバイスをしましょう。



まず、親プロセスでwaitを使わないときには、子プロセスからの終了シグナルを処理しない、と明言しておかないといけません。子プロセスは終了するときに、親プロセスがシグナルを受け取ったかどうかをチェックしていて、受け取るまでゾンビプロセスになって、残っていきます。もちろん親プロセスが終了してしまうと、このプロセスも消えますが.....。終了シグナルを処理しない、という名言は、Solaris では、sigignore(SIGCHLD) というのがあります。他のUNIX系でも似たようなシステムコールあるいは、シグナルが存在するでしょう。

ただ、上記の問題は直接はクライアント側のロックにはつながらないかも知れません。ただ、以下の理由と組み合わさると、ファイルディスクリプタがゾンビに残り続けるということも起こらないやもしれません。

もう一つ、fork, execをやる場合、ソケットなど、様々なファイルディスクリプタの情報が、子プロセスに受け継がれます。受け継がれたあと、親プロセスでソケットを閉じたとしても、子プロセスに残っているので、クライアントではソケットはつながりっぱなしです。子プロセスから孫プロセスへ受け継いでいけば、どんどんディスクリプタはコピーされるわけで、問題は波及していきます。これを解決するのは単純で、forkのあと、子プロセス側で、必要のないファイルディスクリプタは閉じます。そのあとexecするという処理が必要です。

この回答への補足

今日仕事先でアドバイスしていただいたことを試してみました。
 1.sigignore(SIGCHLD) の記述
 2.子プロセスでソケットディスクリプタを閉じてexitする
サーバ側では、データの受信(子プロセス)のあとデータ解析と印刷は孫プロセスがやっています。データを受信してしまったらソケットを切断してもいいので、子プロセスの終了時にソケットディスクリプタを閉じました。結果は残念ながらこれまでと同じくデータ解析等処理の終了までクライアントに切断のイベントは発生しません。ファイルのopen・closeは各プロセス内でやっているので他に閉じるディスクリプタは見当たりませんし。
申し訳ありませんが、まだほかに思い当たることがありましたらお教えください。
よろしくお願いいたします。

補足日時:2002/03/18 22:35
    • good
    • 0
この回答へのお礼

ありがとうございます。
もともとこのソフトは、クライアント(MS-DOS)とサーバ(UNIX)で作られていたものを、できるだけサーバのソフトをそのまま生かす形でクライアントのソフトだけ作り変えています。サーバ側のソフトは私が作ったものではなく、UNIXシステムプログラミングに不慣れなこともあり、fork・exec・wait・signalのあたりを今勉強しているところです。
「fork, execをやる場合、ソケットなど、様々なファイルディスクリプタの情報が、子プロセスに受け継がれます。受け継がれたあと、親プロセスでソケットを閉じたとしても、子プロセスに残っているので、クライアントではソケットはつながりっぱなしです。」というのはまさにその通りですね。子プロセス・孫プロセスで次々とディスクリプタはコピーされるのですね。ここを見直してみます。
本当に詳しいアドバイスをしていただきありがとうございます。

お礼日時:2002/03/18 11:19

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qクライアント サーバ(Win2000)間ソケット通信について

クライアントの通信APLをDebugするのに、仮のサーバ(Win2000)に接続するのですが、サーバ側の通信APを
どう開発していいのか?本等にはUNIXのAPのサンプルは
あるのですが、WINサーバのサンプルがありません。
教えてください。

Aベストアンサー

> telnet (サーバ側のIP) (19485)
> 接続中: xxx.xx.x.xxx...ホストへ接続できませんでした ポート番号 19485 : 接続に失敗しました
> と出力されます。

サーバ側APのbindが、ポート19485で正しくできていないのだと思います。

> 気になるのは、サーバ側でAPをコマンドプロンプトからコマンドを発行してるのですが、
> 入力プロンプトが直ぐに返ってきます。ただ、 タスクマネージャーで見るとプロセスが起動されています。
> 非同期なのですか?

同期/非同期は、アプリの実装に依存します。

「コマンドプロンプトからコマンドを発行」が何を指しているかが分かりませんが、
acceptが即時リターンされ、EWOULDBLOCKなどが返ってきているのであれば
非同期ソケットとして動いているのでしょう。

> サーバ側のAPなのですが、VisualStadioVer6.0にてWin32Applicationにて作成したのですが、
> WinMain()で書きださないとリンク時にエラーになります。

WinMain関数は、いわゆるWin32アプリケーションにおける
main関数だと思ってください。

printf等の標準入出力を使いたいのであれば、
プロジェクトの新規作成→Win32 Console Application で、
HelloWorldアプリケーションをスケルトンに選択すれば分かりやすいと思います。

> telnet (サーバ側のIP) (19485)
> 接続中: xxx.xx.x.xxx...ホストへ接続できませんでした ポート番号 19485 : 接続に失敗しました
> と出力されます。

サーバ側APのbindが、ポート19485で正しくできていないのだと思います。

> 気になるのは、サーバ側でAPをコマンドプロンプトからコマンドを発行してるのですが、
> 入力プロンプトが直ぐに返ってきます。ただ、 タスクマネージャーで見るとプロセスが起動されています。
> 非同期なのですか?

同期/非同期は、アプリの実装に依存します。
...続きを読む

Qソケット通信(サーバ側)について

環境:Windows2000とWindows2000(サーバに見立てて)

WinScok2にてサーバソケットAPを作ったのですが、
クライアントからの接続でタイムアウトエラーになります。
以前にPC側APとサーバAPでポートが同じでなければいけないと言われ修正したのですが、まだ接続できません。
以前の方にも言われたのですが、サーバAPを起動後にプロンプトからtelnet (リスンされたIP) (ポート番号)で起動すると、接続に失敗しました。とメッセージが表示されます。

サーバAPはaccept()で待っている状態です。

何か洩れている箇所があるのでしょか?

Aベストアンサー

>PC側APとサーバAPでポートが同じでなければいけないと言われ
そんなことはないですよ。
Listenポートは指定しますが、クライアント側は、OSから割り当てられたものを
使うのが普通のやり方です。そうしないと困ることがあるはずです。
(Webサーバを稼動させていると、Webクライアントになれないとか...)

>telnet (リスンされたIP) (ポート番号)で起動すると、接続に失敗しました
accept以前に問題がありそうですね。
ソケットの生成(socket)、バインド(bind)、listen でエラーは出ていませんか?
http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/socket.html

参考URL:http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/socket.html

Qsshクライアントで接続先で開いたウィンドウもクライアント側で表示できるもの

sshクライアントで接続先で開いたウィンドウもクライアント側で表示できるものを探しています。(説明ヘタクソですみません)

普段はTera Termを使っているのですが、OpenGLのプログラムを動かしたいので上記のようなソフトがほしいのです。

よろしくお願いします。

Aベストアンサー

クライアント側で、Xサーバーを動かします。サーバー側でプログラム起動時にDISPLAY環境変数で、192.168.0.1:0.0 のようにディスプレイ名を指定します。
「Windows Xサーバー」で検索してみてください。フリーの物、有償の物があります。

Qwaitのつもりがwaitされない!

c言語初心者です。

ライントレーサーを作っています。

とりあえず前進して後進してを繰り返しそうと思って、以下のプログラムを立てました。



#include <pic.h>
__CONFIG(HS&WDTDIS&PWRTEN&UNPROTECT);

int wait(long);

void main(void)
{
int motor;
TRISB=0x00;

while(1)
{
motor=0x90;
wait(1000);

motor=0x60;
wait(1000);

PORTB=motor;
}
}

int wait(long a)
{
long i;
for (i = 0; i < a; i++);
return 0;
}


motor=0x90が前進で
motor=0x60が後進です。


これで動かしたところ、後進しかしませんでした。

どこに原因があるのでしょうか。

ご教授おねがいします。

Aベストアンサー

motorはmainで定義した自動変数ですから、これに何を書き込んでもプログラムの外部へは何も反映されません。
質問ではTRISBやPORTBが何か記載がありませんが、質問のプログラムで後退だけでもモータが動くことを考えると、これらの変数がモータの制御ポートを表しているのでしょう。

無限ループの中を
PORTB=0x90;
wait(1000);
PORTB=0x60;
wait(1000);
にしてどうなるか確認してみましょう。

Qローカル側のC#から、リモートサーバ側のMySQLに接続する方法

さくらインターネットの専用サーバにMySQLを設置しています。

ローカルPC(私の自宅PC・Windows XP)で
VC#2008にて、専用サーバのMySQLに繋ぎ、
データベース操作(select等)を行いたいのですが、
可能でしょうか?

現在、ローカルPCに、MySQL Connector Net 6.2.2をインストールし、
MySql.Data.dllを参照設定でVC#2008の開発中のプロジェクトに
追加しています。

コードは下記URLのソースコードと殆ど同じです。
DB接続情報は勿論専用サーバのMySQLへの接続情報を
設定していまして、Data Sourceには、
localhostを設定しています。

http://hades.arrow.jp/blog/2008/08/cmysql3.html

下記も記述しています。
using MySql.Data.MySqlClient;
using MySql.Data.Types;

実行しますと、下記のステップで失敗します。
// 接続を開く
myConn.Open();

Unable to connect to any of the specified MySQL hosts

というエラーメッセージが出てきます。

以上、問題が分かる方、よろしくお願いします。

さくらインターネットの専用サーバにMySQLを設置しています。

ローカルPC(私の自宅PC・Windows XP)で
VC#2008にて、専用サーバのMySQLに繋ぎ、
データベース操作(select等)を行いたいのですが、
可能でしょうか?

現在、ローカルPCに、MySQL Connector Net 6.2.2をインストールし、
MySql.Data.dllを参照設定でVC#2008の開発中のプロジェクトに
追加しています。

コードは下記URLのソースコードと殆ど同じです。
DB接続情報は勿論専用サーバのMySQLへの接続情報を
設定していまして、Data Sou...続きを読む

Aベストアンサー

専用サーバが、管理者権限全権ありなら、MySQL用のポートを開けておけば接続できるでしょうね。
一般的にはセキュリティの関係などでやらないですが。

やるとしたらSSH経由のMySQL接続ですかね。
http://dev.mysql.com/doc/refman/4.1/ja/windows-and-ssh.html

通信が暗号化されるのでってところが、どうしてもやらないといけないとしたら、使う理由。

VPNで接続できるなら、その選択もありですが。
http://www.itmedia.co.jp/help/howto/linux/vpn/

こちらも暗号化面で比較的安全。

SSHにしても、VPNにしても過信は禁物として。

SSHの欠点は、アプリの作り方か難しくなる、もしくはユーザの利便性が悪くなると言うこと、利点はサーバ上でデフォルトでインストールされている事が期待できる事。
VPNの欠点はサーバにデフォルトではインストールされていないだろう、ということ、利点はリモートとは言えLAN扱いなのでアプリ構築、ユーザ操作は楽ということ。


人気Q&Aランキング

おすすめ情報