
No.7ベストアンサー
- 回答日時:
WinSockでpingっていうと…
「WinSock2.0プログラミング―Window Socket APIによるネットワークプログラミングのすべて」(江村 豊 監修 ソフトバンク ISBN4-7973-0688-2 )
サンプルプログラムがそのままです。
アマゾン.COMにてこの本を購入しました。確かにズバリ希望の
ソースがありました。これを参考にして全体のプログラムを構成する
ことができそうです。この本もLAN通信の解説として良書で、これで
いろいろ勉強してみます。どうも、ありがとうございました。
No.6
- 回答日時:
そこで苦労するなら素直にWinSockでpingを作ったほうが楽ではないでしょうか?
ICMPでechoを送って応答時間を調べるだけです。
この回答への補足
回答、ありがとうございます。
pingを書く方法も検討したいのですが、WinSockではUDP/TCP
しか書いたことがありません。WinSockでpingを書くための
良いサンプルなどがありましたら教えて頂くと助かります。
Netで探せばいいのですが、ネットワーク関連のプログラミング
知識が乏しいため、読みこなせないでおります。
よろしくお願いします。
No.5
- 回答日時:
> しかし、ダイアログベースではAllocConsole();を削除すると
> 動作しなくなってしまいます。どうしても、ダイアログベースで
> 作りたいと思ってます。なかなか難しいですね。
うーん、SDK でならまともに動いたんですが・・・。
MFC は扱ったことがないんでちょっと解らないです・・・。
No.4
- 回答日時:
僕自身勉強中なのでよくわからないんですが・・・。
// コンソール割り当て
FreeConsole();
AllocConsole();
と、コンソールを割り当てている部分を削除して、STARTUPINFO 構造体で、
startInfo.dwFlags = STARTF_USESHOWWINDOW;
startInfo.wShowWindow = SW_HIDE;
のようにしてやってから CreateProcess 関数に渡してやるとコンソールが開かないみたいです。
*************************************************
#include <windows.h>
#include <string.h>
#define R 0
#define W 1
#define CHR_BUF 4048
int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow){
HANDLE hPipeP2C[2]; // 親 → 子 のパイプ(stdin)
HANDLE hPipeC2P[2]; // 子 → 親 のパイプ(stdout)
HANDLE hPipeC2PE[2]; // 子 → 親 のパイプ(stderr)
HANDLE hDupPipeP2CW; // 親 → 子 のパイプ(stdin)の複製
HANDLE hDupPipeC2PR; // 子 → 親 のパイプ(stdout)の複製
HANDLE hDupPipeC2PE; // 子 → 親 のパイプ(stderr)の複製
SECURITY_ATTRIBUTES secAtt;
STARTUPINFO startInfo;
PROCESS_INFORMATION proInfo;
HANDLE hParent = GetCurrentProcess();
char str[CHR_BUF],processName[CHR_BUF];
DWORD dwByte;
//------------------------------------------------------
// パイプ作成(STDOUT,STDERR,STDIN の3本)
// 親の STDOUT , STDIN ,STDERR のハンドルを保存
HANDLE hOldIn = GetStdHandle(STD_INPUT_HANDLE);
HANDLE hOldOut = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE hOldErr = GetStdHandle(STD_ERROR_HANDLE);
// SECURITY_ATTRIBUTES の設定(パイプを作るのに必要
secAtt.nLength = sizeof(SECURITY_ATTRIBUTES);
secAtt.lpSecurityDescriptor = NULL;
secAtt.bInheritHandle = TRUE; // ハンドル継承
//------------------------------------------------------
// STDOUT
// パイプ作成
CreatePipe(&hPipeC2P[R],&hPipeC2P[W],&secAtt,0);
// 「子」プロセスの STDOUT をセット
SetStdHandle(STD_OUTPUT_HANDLE,hPipeC2P[W]);
// 「子」からくるパイプの読み側(つまり親がリードする側)は継承しない
DuplicateHandle(hParent,hPipeC2P[R],hParent,&hDupPipeC2PR,0,FALSE,DUPLICATE_SAME_ACCESS);
// 読み側のハンドルをクローズ
CloseHandle(hPipeC2P[R]);
//------------------------------------------------------
// STDERR
// パイプ作成
CreatePipe(&hPipeC2PE[R],&hPipeC2PE[W],&secAtt,0);
// 「子」プロセスの STDERR をセット
SetStdHandle(STD_ERROR_HANDLE,hPipeC2PE[W]);
// 「子」からくるパイプの読み側(つまり親がリードする側)は継承しない
DuplicateHandle(hParent,hPipeC2PE[R],hParent,&hDupPipeC2PE,0,FALSE,DUPLICATE_SAME_ACCESS);
// 読み側のハンドルをクローズ
CloseHandle(hPipeC2PE[R]);
//------------------------------------------------------
// STDIN
//パイプ作成
CreatePipe(&hPipeP2C[R],&hPipeP2C[W],&secAtt,0);
// 「子」プロセスの STDIN をセット
SetStdHandle(STD_INPUT_HANDLE,hPipeP2C[R]);
// 「子」からくるパイプの書き込み側(つまり親がライトする側)は継承しない
DuplicateHandle(hParent,hPipeP2C[W],hParent,&hDupPipeP2CW,0,FALSE,DUPLICATE_SAME_ACCESS);
// 書き込み側のハンドルをクローズ
CloseHandle(hPipeP2C[W]);
// パイプ作成終了
//------------------------------------------------------
// STARTUPINFO の設定
memset(&startInfo,0,sizeof(STARTUPINFO));
startInfo.cb = sizeof(STARTUPINFO);
startInfo.dwFlags = STARTF_USESHOWWINDOW;
startInfo.wShowWindow = SW_HIDE;
// 子プロセスでコマンドインタープリタを起動
// STDIN,STDOUT,STDIN のハンドルが継承される(つまり親とパイプでつながる)
GetEnvironmentVariable("ComSpec",processName,CHR_BUF);
if(CreateProcess(processName,"",NULL,NULL,TRUE,
0,NULL,NULL,&startInfo,&proInfo)==TRUE){
// 子プロセスが起動したら親の STDIN と STDOUT を戻す
SetStdHandle(STD_OUTPUT_HANDLE,hOldOut);
SetStdHandle(STD_INPUT_HANDLE,hOldIn);
SetStdHandle(STD_ERROR_HANDLE,hOldErr);
// "dir" コマンドを子プロセスに送る
wsprintf(str,"dir\r\n"); // (注) CR-LF を入れないとコマンドを受け取ってくれない
WriteFile(hDupPipeP2CW,str,strlen(str),&dwByte,NULL);
// "exit"
wsprintf(str,"exit\r\n");
WriteFile(hDupPipeP2CW,str,strlen(str),&dwByte,NULL);
// バッファのフラッシュ
FlushFileBuffers(hDupPipeP2CW);
FlushFileBuffers(hDupPipeC2PR);
// 子プロセスが終るまで停止
WaitForSingleObject(proInfo.hProcess,INFINITE);
// 子からきたメッセージを読む
ReadFile(hDupPipeC2PR,str,CHR_BUF,&dwByte,NULL);
str[dwByte] = '\0';
MessageBox(NULL,str,"",NULL);
}
return 0;
}
*************************************************
この回答への補足
回答ありがとうございます。コンソールベースのプログラムでは
確かに新たなコンソールは作らなくなります。
しかし、ダイアログベースではAllocConsole();を削除すると
動作しなくなってしまいます。どうしても、ダイアログベースで
作りたいと思ってます。なかなか難しいですね。
No.3
- 回答日時:
僕もハマリました。
で、調べてみたら、どうやらパイプを使うと標準入力やらを横取りできるらしいです。
http://www.fides.dti.ne.jp/~tokai/vc/index.html
↑の「パイプでプロセス間通信の基本」辺りが参考になるかと思います。
参考URL:http://www.fides.dti.ne.jp/~tokai/vc/index.html
この回答への補足
回答ありがとうございます。
このコードはかなり目的に近いものでした。VisualC++6.0にて、
ダイアログベースのアプリケーションとして、ボタンと
EditBox(メンバ変数:m_ed1)を配置しました。ボタンのハンドラ
を以下のコードにしたところ、pingの出力がみごとにEditBoxに表示
されました。
しかし、実行するとコマンドプロンプトが表示されてしまいます。
コマンドプロンプトの表示を阻止する方法はないでしょうか?
void CP6Dlg::OnButton1()
//int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
//int main(int argc, char* argv[])
{
HANDLE hPipeP2C[2]; // 親 → 子 のパイプ(stdin)
HANDLE hPipeC2P[2]; // 子 → 親 のパイプ(stdout)
HANDLE hPipeC2PE[2]; // 子 → 親 のパイプ(stderr)
HANDLE hDupPipeP2CW; // 親 → 子 のパイプ(stdin)の複製
HANDLE hDupPipeC2PR; // 子 → 親 のパイプ(stdout)の複製
HANDLE hDupPipeC2PE; // 子 → 親 のパイプ(stderr)の複製
SECURITY_ATTRIBUTES secAtt;
STARTUPINFO startInfo;
PROCESS_INFORMATION proInfo;
HANDLE hParent = GetCurrentProcess();
char str[CHR_BUF],processName[CHR_BUF];
DWORD dwByte;
// コンソール割り当て
FreeConsole();
AllocConsole();
//------------------------------------------------------
// パイプ作成(STDOUT,STDERR,STDIN の3本)
// 親の STDOUT , STDIN ,STDERR のハンドルを保存
HANDLE hOldIn = GetStdHandle(STD_INPUT_HANDLE);
HANDLE hOldOut = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE hOldErr = GetStdHandle(STD_ERROR_HANDLE);
// SECURITY_ATTRIBUTES の設定(パイプを作るのに必要
secAtt.nLength = sizeof(SECURITY_ATTRIBUTES);
secAtt.lpSecurityDescriptor = NULL;
secAtt.bInheritHandle = TRUE; // ハンドル継承
//------------------------------------------------------
// STDOUT
// パイプ作成
CreatePipe(&hPipeC2P[R],&hPipeC2P[W],&secAtt,0);
// 「子」プロセスの STDOUT をセット
SetStdHandle(STD_OUTPUT_HANDLE,hPipeC2P[W]);
// 「子」からくるパイプの読み側(つまり親がリードする側)は継承しない
DuplicateHandle(hParent,hPipeC2P[R],hParent,&hDupPipeC2PR,0,FALSE,DUPLICATE_SAME_ACCESS);
// 読み側のハンドルをクローズ
CloseHandle(hPipeC2P[R]);
//------------------------------------------------------
// STDERR
// パイプ作成
CreatePipe(&hPipeC2PE[R],&hPipeC2PE[W],&secAtt,0);
// 「子」プロセスの STDERR をセット
SetStdHandle(STD_ERROR_HANDLE,hPipeC2PE[W]);
// 「子」からくるパイプの読み側(つまり親がリードする側)は継承しない
DuplicateHandle(hParent,hPipeC2PE[R],hParent,&hDupPipeC2PE,0,FALSE,DUPLICATE_SAME_ACCESS);
// 読み側のハンドルをクローズ
CloseHandle(hPipeC2PE[R]);
//------------------------------------------------------
// STDIN
//パイプ作成
CreatePipe(&hPipeP2C[R],&hPipeP2C[W],&secAtt,0);
// 「子」プロセスの STDIN をセット
SetStdHandle(STD_INPUT_HANDLE,hPipeP2C[R]);
// 「子」からくるパイプの書き込み側(つまり親がライトする側)は継承しない
DuplicateHandle(hParent,hPipeP2C[W],hParent,&hDupPipeP2CW,0,FALSE,DUPLICATE_SAME_ACCESS);
// 書き込み側のハンドルをクローズ
CloseHandle(hPipeP2C[W]);
// パイプ作成終了
//------------------------------------------------------
// STARTUPINFO の設定
memset(&startInfo,0,sizeof(STARTUPINFO));
startInfo.cb = sizeof(STARTUPINFO);
// 子プロセスでコマンドインタープリタを起動
// STDIN,STDOUT,STDIN のハンドルが継承される(つまり親とパイプでつながる)
GetEnvironmentVariable("ComSpec",processName,CHR_BUF);
if(CreateProcess(processName,"",NULL,NULL,TRUE,
0,NULL,NULL,&startInfo,&proInfo)==TRUE){
// 子プロセスが起動したら親の STDIN と STDOUT を戻す
SetStdHandle(STD_OUTPUT_HANDLE,hOldOut);
SetStdHandle(STD_INPUT_HANDLE,hOldIn);
SetStdHandle(STD_ERROR_HANDLE,hOldErr);
// "dir" コマンドを子プロセスに送る
//wsprintf(str,"dir\r\n"); // (注) CR-LF を入れないとコマンドを受け取ってくれない
wsprintf(str,"ping localhost\r\n"); // (注) CR-LF を入れないとコマンドを受け取ってくれない
WriteFile(hDupPipeP2CW,str,strlen(str),&dwByte,NULL);
// "exit"
wsprintf(str,"exit\r\n");
WriteFile(hDupPipeP2CW,str,strlen(str),&dwByte,NULL);
// バッファのフラッシュ
FlushFileBuffers(hDupPipeP2CW);
FlushFileBuffers(hDupPipeC2PR);
// 子プロセスが終るまで停止
WaitForSingleObject(proInfo.hProcess,INFINITE);
// 子からきたメッセージを読む
ReadFile(hDupPipeC2PR,str,CHR_BUF,&dwByte,NULL);
str[dwByte] = '\0';
//MessageBox(NULL,str,"",NULL);
m_ed1 = str;
UpdateData(FALSE);
}
//return 0;
}
No.2
- 回答日時:
> Helpを見ると「_popen()をWindowsプログラムで使用すると
> 無効なハンドルが返され、プログラムがハングアップします。」とのこと。
いたたたた...そうでしたか。
お役に立てずごめんなさい。
# うまくいったら教えてくださいな^^;
No.1
- 回答日時:
むちゃくちゃローテクですけど、
FILE* fp = _popen("ping ...", "r");
while ( !feof(fp) ) {
fgets(...);
}
_pclose(fp);
とか^^;
この回答への補足
回答ありがとうございます。Windowプログラムの中で_popen()を使ったら、実行時にエラーになってしまいました。
Helpを見ると「_popen()をWindowsプログラムで使用すると
無効なハンドルが返され、プログラムがハングアップします。」とのこと。
WindowsプログラムではCreatePipe, CreateProcess等々を使えとのことでした。
これでやってみますと、pingを起動することはできるのですが、pingのstdoutを
取ってくるのがうまくいきません。
もう少し試してみて、うまく行かない場合にはまた相談させてください。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Visual Basic(VBA) Excel VBAで教えてください 4 2022/05/11 22:20
- C言語・C++・C# C言語 3 2022/10/04 15:07
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 3 2022/06/12 11:17
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- 戸籍・住民票・身分証明書 債務者の実家住所(戸籍附票) 3 2023/05/20 06:09
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- 虫除け・害虫駆除 ノミの除去 2 2022/09/06 08:52
- その他(インターネット接続・インフラ) ブラウザにIPアドレス入力した時 1 2022/06/16 19:08
このQ&Aを見た人はこんなQ&Aも見ています
-
pingの結果を取得する方法
C言語・C++・C#
-
ネットワークにつながっているかの確認
UNIX・Linux
-
エディットボックスのフォントを変えたい
C言語・C++・C#
-
-
4
C言語でpingを実行してその結果をもらうプログラム
C言語・C++・C#
-
5
Winsockで接続待ちタイムアウトを設定する方法
C言語・C++・C#
-
6
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
7
MFCアプリのコマンドラインでパラメータを使用した起動方法
C言語・C++・C#
-
8
Cでのネットワークファイルの読み書き
C言語・C++・C#
-
9
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
10
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
11
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
12
MFCのタイマーのつかい方を教えてください
C言語・C++・C#
-
13
VC++から引数付きexeファイルの実行
C言語・C++・C#
-
14
ファイルやディレクトリの存在確認を行う方法
C言語・C++・C#
-
15
WORD型をCString型に変換する方法
C言語・C++・C#
-
16
CString から LPCTSTRの型に変換
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
C#でのbatファイル実行結果取得
-
ADOでアクセスのレコードに...
-
共有メモリの使い方について
-
プロセスのアタッチ・デタッチ...
-
フックのタイミング
-
ロードアベレージが高いのです...
-
WSH.Runで待機できません
-
GPLによるソース公開の回避方法
-
getppid()の使い方を教えてくだ...
-
プロセスが実行中かどうか調べ...
-
DLLにおいて、最後のプロセスデ...
-
非表示になったエクセルは?
-
常駐するアプリケーションを初...
-
プロセスIDの取得方法について
-
タスクマネージャーのプロセス...
-
OSPFでプロセスを分ける意義に...
-
SendMessageが失敗するときがある
-
CreateProcess時の実行ユーザ変...
-
子プロセスのデバッグ方法について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
VB6.0 SHELLで起動...
-
プロセスIDの取得方法について
-
C#でのbatファイル実行結果取得
-
タスクマネージャーのプロセス...
-
プロセスのアタッチ・デタッチ...
-
vb.netでEXCEL起動がうまくでき...
-
SendMessageが失敗するときがある
-
ADOでアクセスのレコードに...
-
非表示になったエクセルは?
-
explorer.exeが異様にメモリを食う
-
怪しいプロセス教えてください。
-
Process.Startの戻り値を後で取得
-
プロセスIDからウィンドウハ...
-
Linuxでのスレッド間メッセージ...
-
警告『 別のプロセスで使用され...
-
Visual C++からpingを実行して...
-
WSH.Runで待機できません
-
c言語でプロセスIDを調べたい
-
API関数 GetExitCodeProcess
おすすめ情報