Обмен данными через Pipes по сети между 2-мя машинами
От: DD_SSS  
Дата: 05.10.04 13:38
Оценка:
Здравствуйте!
Помогите разобраться в чём ошибка!

На СЕРВЕРЕ
Piperes = CreateNamedPipeA("\\.\pipe\vbpgpipeSave", PIPE_ACCESS_DUPLEX Or WRITE_DAC, PIPE_TYPE_BYTE, 10, 10, 10, 0, Nothing)
If Piperes = -1 Then MsgBox("ERROR")


На КЛИЕНТЕ
PiperesSave = CreateFileA("\\KKM\pipe\vbpgpipeSave", GENERIC_WRITE, FILE_SHARE_WRITE Or FILE_SHARE_READ, qwe, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)

Почему PiperesSave =-1????
Re: Обмен данными через Pipes по сети между 2-мя машинами
От: Leonid Troyanovsky  
Дата: 05.10.04 13:46
Оценка: +1
Здравствуйте, DD_SSS, Вы писали:

DD_>Почему PiperesSave =-1????


Почему = GetLastError.
--
С уважением, LVT
Re[2]: Обмен данными через Pipes по сети между 2-мя машинами
От: DD_SSS  
Дата: 05.10.04 13:49
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

LT>Здравствуйте, DD_SSS, Вы писали:


DD_>>Почему PiperesSave =-1????


LT> Почему = GetLastError.


Но, если
На СЕРВЕРЕ
Piperes = CreateNamedPipeA("\\.\pipe\vbpgpipeSave", PIPE_ACCESS_DUPLEX Or WRITE_DAC, PIPE_TYPE_BYTE, 10, 10, 10, 0, Nothing)
If Piperes = -1 Then MsgBox("ERROR")


На КЛИЕНТЕ
PiperesSave = CreateFileA("\\KKM\pipe\vbpgpipeSave", GENERIC_READ, FILE_SHARE_WRITE Or FILE_SHARE_READ, qwe, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)

ТО всё ОК.
Re[3]: Обмен данными через Pipes по сети между 2-мя машинами
От: Leonid Troyanovsky  
Дата: 05.10.04 13:58
Оценка:
Здравствуйте, DD_SSS, Вы писали:

DD_>>>Почему PiperesSave =-1????


LT>> Почему = GetLastError.


И..?

DD_>Но, если

DD_>PiperesSave = CreateFileA("\\KKM\pipe\vbpgpipeSave", GENERIC_READ,
..
DD_>ТО всё ОК.

Например, GetLastError = 5
А клиент, скажем, win9x.
--
С уважением, LVT
Re[4]: Обмен данными через Pipes по сети между 2-мя машинами
От: DD_SSS  
Дата: 06.10.04 05:43
Оценка:
Извините, конечно, но может объясните мне бестолковому почему у меня не получается обмен данными по сети через pipes.
На локалке все люкс. Канал создается, открывается, записывается, считывается. Как только сервер выношу на машину в сети, то не могу открыть канал на запись (открываю через CreateFileA)
Re[5]: Обмен данными через Pipes по сети между 2-мя машинами
От: Сергей Мухин Россия  
Дата: 06.10.04 06:13
Оценка:
Здравствуйте, DD_SSS, Вы писали:

DD_>Извините, конечно, но может объясните мне бестолковому почему у меня не получается обмен данными по сети через pipes.

DD_>На локалке все люкс. Канал создается, открывается, записывается, считывается. Как только сервер выношу на машину в сети, то не могу открыть канал на запись (открываю через CreateFileA)

чему равен GetLastError?
пользователи разные на разных машинах?
---
С уважением,
Сергей Мухин
Re[6]: Обмен данными через Pipes по сети между 2-мя машинами
От: DD_SSS  
Дата: 06.10.04 06:18
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, DD_SSS, Вы писали:


DD_>>Извините, конечно, но может объясните мне бестолковому почему у меня не получается обмен данными по сети через pipes.

DD_>>На локалке все люкс. Канал создается, открывается, записывается, считывается. Как только сервер выношу на машину в сети, то не могу открыть канал на запись (открываю через CreateFileA)

СМ>чему равен GetLastError?

СМ>пользователи разные на разных машинах?

GetLastError=-1 при CreateFileA("\\ИМЯ_МАШИНЫ_СЕРВЕРА\pipe\vbpgpipeSave", GENERIC_WRITE, FILE_SHARE_WRITE Or FILE_SHARE_READ, qwe, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
и
GetLastError=33** (не помню) при CreateFileA("\\ИМЯ_МАШИНЫ_СЕРВЕРА\pipe\vbpgpipeSave", GENERIC_READ, FILE_SHARE_WRITE Or FILE_SHARE_READ, qwe, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)

Пользователи действительно разные, хотя оба админы
Re[5]: Обмен данными через Pipes по сети между 2-мя машинами
От: Leonid Troyanovsky  
Дата: 06.10.04 06:26
Оценка:
Здравствуйте, DD_SSS, Вы писали:

DD_>Извините, конечно, но может объясните мне бестолковому почему у меня не получается обмен данными по сети через pipes.


Do you speak English? — Канэчно, хачу..

DD_>На локалке все люкс. Канал создается, открывается, записывается, считывается. Как только сервер выношу на машину в сети, то не могу открыть канал на запись (открываю через CreateFileA)


А кто такой nothing? Если оно NULL, то для сети этого может быть маловато.
Можно попробывать открыть для всех — с нулевым DACL, что-то вроде:

  {TSecurityDescriptor}
  if not InitializeSecurityDescriptor(@sd, 1) or
     not SetSecurityDescriptorDACL(@sd, true, PACL(nil), False) then
        raise Exception.Create('Pipe security failed');

  {TSecurityAttributes}
  sa.nLength:=SizeOf(sa);
  sa.lpSecurityDescriptor:=@sd;
  sa.bInheritHandle:= False;
  ..
  CreatePipe( .., @sa);


Ну, а имя ему я б задал большими буквами, не более 8.3 символов,
на всякий пожарный случай (клиент win95).
--
С уважением, LVT
Re[7]: Обмен данными через Pipes по сети между 2-мя машинами
От: Сергей Мухин Россия  
Дата: 06.10.04 06:27
Оценка:
Здравствуйте, DD_SSS, Вы писали:
DD_>GetLastError=33** (не помню) при CreateFileA("\\ИМЯ_МАШИНЫ_СЕРВЕРА\pipe\vbpgpipeSave", GENERIC_READ, FILE_SHARE_WRITE Or FILE_SHARE_READ, qwe, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)

ERROR_LOCK_VIOLATION


DD_>Пользователи действительно разные, хотя оба админы


попробуй под одним пользователем или исп security.


The security descriptor controls access to both client and server ends of the named pipe. If you specify NULL, the named pipe gets a default security descriptor. The ACLs in the default security descriptor for a named pipe grant full control to the LocalSystem account, administrators, and the creator owner. They also grant read access to members of the Everyone group and the anonymous account.
---
С уважением,
Сергей Мухин
Re[8]: Обмен данными через Pipes по сети между 2-мя машинами
От: DD_SSS  
Дата: 06.10.04 07:29
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, DD_SSS, Вы писали:

DD_>>GetLastError=33** (не помню) при CreateFileA("\\ИМЯ_МАШИНЫ_СЕРВЕРА\pipe\vbpgpipeSave", GENERIC_READ, FILE_SHARE_WRITE Or FILE_SHARE_READ, qwe, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)

СМ>ERROR_LOCK_VIOLATION



DD_>>Пользователи действительно разные, хотя оба админы


СМ>попробуй под одним пользователем или исп security.


попробовал, все равно "-1". Кстати интересная вещь (раньше не заметил)
при дебуге
в коде CreateFileA("\\ИМЯ_МАШИНЫ_СЕРВЕРА\pipe\vbpgpipeSave", GENERIC_READ, FILE_SHARE_WRITE Or FILE_SHARE_READ, qwe, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) и CreateFileA("\\KKM\pipe\vbpgpipeLoad", GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, qwe, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) не проходят(равны -1), а если
в command window, то CreateFileA("\\KKM\pipe\vbpgpipeLoad", GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, qwe, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) проходит нормально


если в коде написано:
Re[6]: Обмен данными через Pipes по сети между 2-мя машинами
От: DD_SSS  
Дата: 06.10.04 08:14
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

LT>Здравствуйте, DD_SSS, Вы писали:


DD_>>Извините, конечно, но может объясните мне бестолковому почему у меня не получается обмен данными по сети через pipes.


LT> Do you speak English? — Канэчно, хачу..


DD_>>На локалке все люкс. Канал создается, открывается, записывается, считывается. Как только сервер выношу на машину в сети, то не могу открыть канал на запись (открываю через CreateFileA)


LT> А кто такой nothing? Если оно NULL, то для сети этого может быть маловато.

LT> Можно попробывать открыть для всех — с нулевым DACL, что-то вроде:

LT>
LT>  {TSecurityDescriptor}
LT>  if not InitializeSecurityDescriptor(@sd, 1) or
LT>     not SetSecurityDescriptorDACL(@sd, true, PACL(nil), False) then
LT>        raise Exception.Create('Pipe security failed');

LT>  {TSecurityAttributes}
LT>  sa.nLength:=SizeOf(sa);
LT>  sa.lpSecurityDescriptor:=@sd;
LT>  sa.bInheritHandle:= False;
LT>  ..
LT>  CreatePipe( .., @sa);
LT>


LT> Ну, а имя ему я б задал большими буквами, не более 8.3 символов,

LT> на всякий пожарный случай (клиент win95).

Прошу прощения, но я что-то не догнал какие значения должны быть в nLength и lpSecurityDescriptor
Re[6]: Обмен данными через Pipes по сети между 2-мя машинами
От: DD_SSS  
Дата: 06.10.04 08:57
Оценка:
Кстати, забыл сказать: открывал файл на СЕРВЕРЕ
CreateFileA("\\KKM\D\TEST\bin\CASsserv.pdb", GENERIC_WRITE, FILE_SHARE_WRITE Or FILE_SHARE_READ, Nothing, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
Открывается без проблем!
Re[7]: Обмен данными через Pipes по сети между 2-мя машинами
От: Leonid Troyanovsky  
Дата: 06.10.04 12:26
Оценка:
Здравствуйте, DD_SSS, Вы писали:

DD_>Прошу прощения, но я что-то не догнал какие значения должны быть в nLength и lpSecurityDescriptor


nLength

Specifies the length, in bytes, of this structure. This value is to be set to the size of the SECURITY_ATTRIBUTES structure.

lpSecurityDescriptor

Points to a security descriptor for the object that controls the sharing of it. If NULL is specified for this member, the object may be assigned the default security descriptor of the calling process.

Без msdn будет нелегко
--
С уважением, LVT
Re[7]: Обмен данными через Pipes по сети между 2-мя машинами
От: Leonid Troyanovsky  
Дата: 06.10.04 12:33
Оценка:
Здравствуйте, DD_SSS, Вы писали:

DD_>Кстати, забыл сказать: открывал файл на СЕРВЕРЕ

..
DD_>Открывается без проблем!

Ну, это, вроде бы, мы уже слышали и даже оному не очень удивились.
Если сервер и клиент пускаются в одной сессии, то прав для доступа
по умолчанию (NULL, nothing, nil, etc) вполне хватает
--
С уважением, LVT
Re: Обмен данными через Pipes по сети между 2-мя машинами
От: AndreyT  
Дата: 06.10.04 13:26
Оценка:
Здравствуйте, DD_SSS, Вы писали:

DD_>Здравствуйте!

DD_>Помогите разобраться в чём ошибка!

DD_>На СЕРВЕРЕ

DD_>Piperes = CreateNamedPipeA("\\.\pipe\vbpgpipeSave", PIPE_ACCESS_DUPLEX Or WRITE_DAC, PIPE_TYPE_BYTE, 10, 10, 10, 0, Nothing)
DD_>If Piperes = -1 Then MsgBox("ERROR")


DD_>На КЛИЕНТЕ

DD_>PiperesSave = CreateFileA("\\KKM\pipe\vbpgpipeSave", GENERIC_WRITE, FILE_SHARE_WRITE Or FILE_SHARE_READ, qwe, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)

DD_>Почему PiperesSave =-1????



По умолчанию, именованный канал не даёт прав на подсоединение удалённым клиентам (нетрудно догадаться — почему). Надо задавать дескриптор явно.

Например, так

#define    DEFAULT_DACL L"D:(A;OICI;GRGWGX;;;DC)(A;OICI;GRGWGX;;;NU)(A;OICI;GRGWGX;;;DG)(A;OICI;GRGWGX;;;WD)(A;OICI;GRGWGX;;;AU)(A;OICI;GA;;;BA)"

...

//create DACL for the pipe
    SECURITY_ATTRIBUTES sa;
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle = false;

    ConvertStringSecurityDescriptorToSecurityDescriptorW(DEFAULT_DACL,
        SDDL_REVISION_1,
        &sa.lpSecurityDescriptor,
        NULL );

    hPipe = CreateNamedPipe( SZPIPENAME,
                FILE_FLAG_OVERLAPPED | PIPE_ACCESS_DUPLEX,
                PIPE_TYPE_MESSAGE|PIPE_READMODE_MESSAGE | PIPE_WAIT,
                1,        //no of instances
                DEFAULT_IO_BUFFER_SIZE,    //InBuffer size
                DEFAULT_IO_BUFFER_SIZE,    //OutBuffer size
                DEFAULT_PIPE_TIMEOUT,
                &sa );


Синтаксис функции ConvertStringSecurityDescriptorToSecurityDescriptor пожробно описан в MSDN.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.