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
VCのツールにError Lookupと言うツールがあるのでそれでエラーコードが意味するところを
調べてみてください。
内容からすると
「ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。」
だそうです。
補足致します
CreateNamedPipeの設定で
ローカルマシン外で通信を行う場合には、
\\リモートマシン名\pipe\パイプ名
とあり
また逆に
ローカルマシン内で通信を行う場合には、
\\.\pipe\パイプ名
とあるため、上記のようにしました。
リモートマシン名に漢字が含まれていた場合にCreateNamedPipeってうまく行きますかね。
思いつくのはそれくらいですが。
PATIOさん>
なるほどです。
デバッグしたところ
>::GetComputerName(SvcName, &dwsize)
の戻り値(マシン名)に漢字・全角英数字は入っていませんでした
私はpipeを使った事がないので良く分かりませんが、
よく考えたらサーバー側は、\\\\.\\pipe\\pipe_recvで良いのでは?
クライアント側が接続先のPC名を指定すれば、良いような気がしますけれど。
違うかな。
パイプを他のコンピュータ上に作ることはできません。
http://msdn.microsoft.com/library/en-us/ipc/base/pipe_names.asp
クライアント側はCreateFileで開くみたいですね。
そっちに\\\\HOSTNAME\\pipe\\pipe_recvを指定すれば言いと言う事ですね。
この場合、パイプを作るのではなくて開くわけだから問題ないという事で。
今回の問題とは違うかもしれませんが
PC-PC間で通信する場合、LPSECURITY_ATTRIBUTESも
まじめに設定しないと動かなかった経験があります。
一歩前進しました!
皆様の意見を参考にして
[Server]
CreateNamedPipeの設定を \\\\.\\PIPE\\PIPE_RECV
[Client]
CreateFileの設定を \\\\ServerName\\PIPE\\PIPE_RECV
としたところ、ClientのCreateFileでエラー(アクセス権がありません→ハンスさん指摘事
項?)は出たものの、一つ問題は解決という感じです。