
こんにちは。
非同期のプロセス間通信(パイプ)で詰まっています。
環境は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も見ています
-
エディットボックスで改行
その他(プログラミング・Web制作)
-
ConnectNamedPipeの接続待ち
C言語・C++・C#
-
非ブロッキングソケットのrecvについて
C言語・C++・C#
-
-
4
ソケット通信で接続クライアントの上限を設ける
C言語・C++・C#
-
5
(マルチスレッド)_beginthreadexに複数の引数を渡す
C言語・C++・C#
-
6
OVERLAPPED構造体が分かりません・・。
C言語・C++・C#
-
7
CStringをwchar_tに変換したい
C言語・C++・C#
-
8
エディットボックスの入力制限について
C言語・C++・C#
-
9
画面を強制的に再描画させる方法
C言語・C++・C#
-
10
スレッドの終了の仕方
C言語・C++・C#
-
11
HANDLEの宣言でのエラー
C言語・C++・C#
-
12
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
13
winsock windowprocでFD_WRITEの処理
C言語・C++・C#
-
14
ネットワーク切断を検出するには?
C言語・C++・C#
-
15
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
-
16
ListBoxで改行したい
Visual Basic(VBA)
-
17
SetDlgItemInt( ) c++
C言語・C++・C#
-
18
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
-
19
エディットコントロールでEnter押した時の動作
C言語・C++・C#
-
20
CString から LPCTSTRの型に変換
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
XMLでデータとして画像を指定す...
-
C# DataTableに最後に追加した...
-
【VB.NET】Excelの最終行までの...
-
エクセルのセル最終行取得
-
VBAコンボボックスの内容が反映...
-
エクセルのマクロ コンボボッ...
-
AccessVBAでのExcelメモリ解放
-
MSFlexGrid 行選択状態
-
VB.Net ResetBindings リクエリ
-
batでレジストリキーから読み取...
-
ExcelVBAで戻り値を返すには
-
【C#】textBoxの指定行のデータ...
-
ACCESS VBA フォーム複数条件
-
他のMDBのテーブルに追加したい
-
VBA 変数名に変数を使用したい。
-
『列名 '担当者CD' があいま...
-
Access2007でアプリケーション...
-
ActiveReports(アクティブレポ...
-
VB.NETで1→A、2→B、26→Z、27→AA...
-
INT64対応のprintf系関数はあり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# DataTableに最後に追加した...
-
【C#】textBoxの指定行のデータ...
-
VBAコンボボックスの内容が反映...
-
VBAでアクセスDBからデータの取...
-
【VB.NET】Excelの最終行までの...
-
XMLでデータとして画像を指定す...
-
VB2010で、選択した系列を最前...
-
Excel VBAで1週間毎にカテゴリ...
-
COBOL数値転記の仕様
-
【ExcelVBA】値を変更しながら...
-
非同期のプロセス間通信(パイプ...
-
「Nullの使い方が不正です」の...
-
エクセルのマクロ コンボボッ...
-
ExcelVBAで戻り値を返すには
-
Excel VBAでフォルダ内の全テキ...
-
ListViewで表示されたデータの...
-
クリスタルレポートでレコード...
-
Excel VBA で日付を4ケタの数値...
-
ActiveReportのdetailをデータ...
-
アクセスでウェブ上のデータを...
おすすめ情報