名前付きパイプで通信したい – プログラミング – Home

名前付きパイプで通信したい
 
通知
すべてクリア

名前付きパイプで通信したい


taro
 taro
(@taro)
ゲスト
結合: 23年前
投稿: 21
Topic starter  

PC-PC間で通信するのにソケットではなく名前付きパイプを使ってやろうとしています

サーバ側のCreateNamedPipe処理でエラー123になってしまいます
打開策御存知の方いらっしゃいましたら御教授願います。

char SvcName[255];
CString PIPE_REMOTE;
DWORD dwsize=255;
// サーバ マシン名取得
if (::GetComputerName(SvcName, &dwsize) == FALSE) return;

// PIPE NAME作成
PIPE_REMOTE.Format(\\\\%s\\PIPE\\PIPE_RECV, SvcName);

// PIPE作成
HANDLE hPipe;
hPipe = CreateNamedPipe(
LPCTSTR(PIPE_REMOTE),
PIPE_ACCESS_DUPLEX,
PIPE_WAIT,
PIPE_UNLIMITED_INSTANCES,
1024,
1024,
(120*1000),
NULL);

DWORD err = GetLastError();

環境
OS:WindowsXP
VC:6.0


引用解決済
トピックタグ
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

VCのツールにError Lookupと言うツールがあるのでそれでエラーコードが意味するところを
調べてみてください。
内容からすると
「ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。」
だそうです。


返信引用
taro
 taro
(@taro)
ゲスト
結合: 23年前
投稿: 21
Topic starter  

補足致します

CreateNamedPipeの設定で
ローカルマシン外で通信を行う場合には、
\\リモートマシン名\pipe\パイプ名
とあり
また逆に
ローカルマシン内で通信を行う場合には、
\\.\pipe\パイプ名
とあるため、上記のようにしました。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

リモートマシン名に漢字が含まれていた場合にCreateNamedPipeってうまく行きますかね。
思いつくのはそれくらいですが。


返信引用
taro
 taro
(@taro)
ゲスト
結合: 23年前
投稿: 21
Topic starter  

PATIOさん>
なるほどです。
デバッグしたところ
>::GetComputerName(SvcName, &dwsize)
の戻り値(マシン名)に漢字・全角英数字は入っていませんでした


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

私はpipeを使った事がないので良く分かりませんが、
よく考えたらサーバー側は、\\\\.\\pipe\\pipe_recvで良いのでは?
クライアント側が接続先のPC名を指定すれば、良いような気がしますけれど。
違うかな。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

パイプを他のコンピュータ上に作ることはできません。
http://msdn.microsoft.com/library/en-us/ipc/base/pipe_names.asp


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

クライアント側はCreateFileで開くみたいですね。
そっちに\\\\HOSTNAME\\pipe\\pipe_recvを指定すれば言いと言う事ですね。
この場合、パイプを作るのではなくて開くわけだから問題ないという事で。


返信引用
ハンス
 ハンス
(@ハンス)
ゲスト
結合: 22年前
投稿: 7
 

今回の問題とは違うかもしれませんが
PC-PC間で通信する場合、LPSECURITY_ATTRIBUTESも
まじめに設定しないと動かなかった経験があります。


返信引用
taro
 taro
(@taro)
ゲスト
結合: 23年前
投稿: 21
Topic starter  

一歩前進しました!
皆様の意見を参考にして

[Server]
CreateNamedPipeの設定を \\\\.\\PIPE\\PIPE_RECV

[Client]
CreateFileの設定を \\\\ServerName\\PIPE\\PIPE_RECV

としたところ、ClientのCreateFileでエラー(アクセス権がありません→ハンスさん指摘事
項?)は出たものの、一つ問題は解決という感じです。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました