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

[戻る]
taro 2005/09/13(火) 15:55:14
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 2005/09/13(火) 16:03:19
VCのツールにError Lookupと言うツールがあるのでそれでエラーコードが意味するところを
調べてみてください。
内容からすると
「ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。」
だそうです。

taro 2005/09/13(火) 16:12:21
補足致します

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

PATIO 2005/09/13(火) 16:23:52
リモートマシン名に漢字が含まれていた場合にCreateNamedPipeってうまく行きますかね。
思いつくのはそれくらいですが。

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

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

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

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

ハンス 2005/09/14(水) 10:35:05
今回の問題とは違うかもしれませんが
PC-PC間で通信する場合、LPSECURITY_ATTRIBUTESも
まじめに設定しないと動かなかった経験があります。

taro 2005/09/14(水) 14:14:48
一歩前進しました!
皆様の意見を参考にして

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

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

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

古いスレッドには追加発言できません。