こんにちは。
非同期のプロセス間通信(パイプ)で詰まっています。
環境はWindowsで処理系はC++(Win32)です。
スレッドを用意して、
hPipe = ::CreateFile( L"\\\\.\\pipe\\pipename", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL ) ;
で作成し、OVERLAPPED構造体を
//
ZeroMemory( &so, sizeof( OVERLAPPED )) ;
sOverlapped.hEvent = ::CreateEvent( NULL, FALSE, FALSE, NULL ) ;
として、
const size_t bufsize = 16 ;
BYTE buffer[ uBufSize ] ;
DWORD dwNumberOfBytesRead ;
bRet = ::ReadFile( hPipe, buffer, bufsize, &dwNumberOfBytesRead, &so ) ;
で読み込みをしています。ReadFile関数はすぐ戻りbRetはFALSEで返ってくるため、GetLastErrorを調べて、
switch( ::GetLastError())
{
case ERROR_IO_PENDING :
bRet = ::GetOverlappedResult( hPipe, &so, &dwNumberOfBytesRead, FALSE ) ;
break ;
}
としてWaitForMultipleObjectsでsOverlapped.hEventがシグナル状態になったら取得したデータの処理をしています。
シグナル状態になるならないに関わらず、上記のReadFileとGetOverlappedResultはループでぐるぐる回しています。
上記の状態で短いデータならよかったのですが、上記のReadFileで読み込み最大サイズの16バイトを超えてしまとうと、
残りの部分のみしか取得できませんでした。
0123456789ABCDEFabcdefg
というデータを受信しようとしたとき、後半のabcdefgだけしか取得できませんでした。
すべてのデータを正しく取得するにはどのようにしたらよいのでしょうか?
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
TeijigoTeatimeさん、こんにちは。
提示されたコードは受け側のコードですね。
送り側はどうやってますか?
CreateNamedPipeでパイプを生成している思いますが、その第5、第6引数に何を与えていますか?
パイプで送受信するバッファが16バイトしか用意されていないということはないですか。
この回答への補足
こんばんは。レスありがとうございます。
CreateNamedPipeは以下で作成しています。
hPipe = ::CreateNamedPipe( "\\\\.\\pipe\\commandersvc", PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 10, 1024, 1024, 100, &secAttr ) ;
受信側で取りこぼしている感じがしてので上記のような質問をさせていただきました。
原因がわかりました。
オーバーラップで処理しているので
case ERROR_IO_PENDING :
のあとで、きちんとイベント待ちしてから処理すれば取得できることができました。
返答頂いたことでいろいろ考えることができました。
ありがとうございました。
No.1
- 回答日時:
dwNumberOfBytesReadの数値はどうなってますか?
この回答への補足
こんにちは。
dwNumberOfBytesReadは7です。"abcdefg"だけが受信できている感じです。
受信側でずっとdwNumberOfBytesReadの中身を監視しても前半の部分が取得された形跡はありませんでした。
送信側では
bRet=::WriteFile(hPipe, "0123456789ABCDEFabcdefg",23,&dwWritten,&so) ;
で送信していますが、dwWrittenは23となっており全て送信されている感じです。
1回目のReadFileで"0123456789ABCDEF"が取得でき、2回目で残りを受信と期待していたのですがその通り動作していません。
原因がわかりました。
オーバーラップで処理しているので
case ERROR_IO_PENDING :
のあとで、きちんとイベント待ちしてから処理すれば取得できることができました。
返答頂いたことでいろいろ考えることができました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- Excel(エクセル) VBA : スクレイピングできない 4 2023/05/12 22:26
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) Excelでnullになるような式のセルをマクロで空白行と認識させるにはどうすればいいですか? 3 2023/03/13 13:42
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
ConnectNamedPipeの接続待ち
C言語・C++・C#
-
プロセス間通信について
Visual Basic(VBA)
-
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
-
4
charからLPTSTRへの変換方法
C言語・C++・C#
-
5
パイプを用いたプロセス間通信について
C言語・C++・C#
-
6
c++std::string型をTCHARに変換したい!
C言語・C++・C#
-
7
マルチスレッドプログラミングについて
C言語・C++・C#
-
8
ネットワーク切断を検出するには?
C言語・C++・C#
-
9
OVERLAPPED構造体が分かりません・・。
C言語・C++・C#
-
10
CString から LPCTSTRの型に変換
C言語・C++・C#
-
11
int型の内容をbyteの配列にコピー
Java
-
12
スレッドの終了の仕方
C言語・C++・C#
-
13
MFCダイアログボックスを最前面に表示
C言語・C++・C#
-
14
(マルチスレッド)_beginthreadexに複数の引数を渡す
C言語・C++・C#
-
15
HANDLEの宣言でのエラー
C言語・C++・C#
-
16
有効なWin32アプリケーションではありません
iOS
-
17
MFCのタイマーのつかい方を教えてください
C言語・C++・C#
-
18
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
19
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
20
unsigned long long 型のフォーマット指定子
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【VB.NET】Excelの最終行までの...
-
「Nullの使い方が不正です」の...
-
C# DataTableに最後に追加した...
-
【C#】textBoxの指定行のデータ...
-
非同期のプロセス間通信(パイプ...
-
batでレジストリキーから読み取...
-
java / jsp selectedについて
-
エクセルのマクロ コンボボッ...
-
Excel VBAでグラフの可変データ...
-
ADODBでの行番号の取得、もしく...
-
VBAコンボボックスの内容が反映...
-
VB2005 で NetworkStream で取...
-
ActiveReportのdetailをデータ...
-
COBOL数値転記の仕様
-
MSFlexGrid 行選択状態
-
エクセルのCSV読み込みについて
-
アクセスでウェブ上のデータを...
-
XMLでデータとして画像を指定す...
-
[リボンのキーボード ショート...
-
VBAでアクセスDBからデータの取...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
XMLでデータとして画像を指定す...
-
【C#】textBoxの指定行のデータ...
-
VBAでアクセスDBからデータの取...
-
Excel VBAでフォルダ内の全テキ...
-
【VB.NET】Excelの最終行までの...
-
C# DataTableに最後に追加した...
-
「Nullの使い方が不正です」の...
-
VBAコンボボックスの内容が反映...
-
COBOL数値転記の仕様
-
クリスタルレポートでレコード...
-
VB2010で、選択した系列を最前...
-
アクセスでウェブ上のデータを...
-
Excel VBAで1週間毎にカテゴリ...
-
非同期のプロセス間通信(パイプ...
-
エクセルのセル最終行取得
-
ActiveReportのdetailをデータ...
-
富士通(汎用機)のAIMについて
-
Excel VBAでグループ毎に集計す...
-
エクセルのCSV読み込みについて
-
AccessVBAでのExcelメモリ解放
おすすめ情報