
こんにちは。
非同期のプロセス間通信(パイプ)で詰まっています。
環境は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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
エディットボックスで改行
その他(プログラミング・Web制作)
-
非ブロッキングソケットのrecvについて
C言語・C++・C#
-
ソケット通信で接続クライアントの上限を設ける
C言語・C++・C#
-
-
4
CStringをwchar_tに変換したい
C言語・C++・C#
-
5
エディットボックスの入力制限について
C言語・C++・C#
-
6
スレッドの終了の仕方
C言語・C++・C#
-
7
winsock windowprocでFD_WRITEの処理
C言語・C++・C#
-
8
ConnectNamedPipeの接続待ち
C言語・C++・C#
-
9
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
-
10
ネットワーク切断を検出するには?
C言語・C++・C#
-
11
OVERLAPPED構造体が分かりません・・。
C言語・C++・C#
-
12
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
-
13
メインスレッドのPostMessageとマルチスレッドでの処理
C言語・C++・C#
-
14
ListBoxで改行したい
Visual Basic(VBA)
-
15
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
-
16
エディットコントロールでEnter押した時の動作
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
COBOL数値転記の仕様
-
C# DataTableに最後に追加した...
-
【ExcelVBA】値を変更しながら...
-
VB.Net ResetBindings リクエリ
-
非同期のプロセス間通信(パイプ...
-
ListViewで表示されたデータの...
-
Excel VBAで1週間毎にカテゴリ...
-
VBAでアクセスDBからデータの取...
-
MSFlexGrid 行選択状態
-
XMLでデータとして画像を指定す...
-
アクセスでウェブ上のデータを...
-
エクセルのCSV読み込みについて
-
VBAコンボボックスの内容が反映...
-
矩形グラフ(オシロやロジアナ...
-
DataGridの全行編集状態での行追加
-
SAP BAPIの戻り値参照時のエラー
-
【VB.NET】Excelの最終行までの...
-
VB2008,DateTimePickerで指定す...
-
VBA 変数名に変数を使用したい。
-
Dir関数で読み取り順を操作でき...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# DataTableに最後に追加した...
-
VBAコンボボックスの内容が反映...
-
TextBox内の改行
-
【C#】textBoxの指定行のデータ...
-
【VB.NET】Excelの最終行までの...
-
COBOL数値転記の仕様
-
AccessVBAでのExcelメモリ解放
-
VBAでアクセスDBからデータの取...
-
XMLでデータとして画像を指定す...
-
「Nullの使い方が不正です」の...
-
【ExcelVBA】値を変更しながら...
-
非同期のプロセス間通信(パイプ...
-
アクセスでウェブ上のデータを...
-
Excel VBAでフォルダ内の全テキ...
-
エクセルのセル最終行取得
-
batでレジストリキーから読み取...
-
データベースへのアクセス
-
vbaで出来ますか?
-
ListViewで表示されたデータの...
-
ACCESS2010で直近の日付を取得...
おすすめ情報