Подключение к именованному каналу
Пробовал с помощью именованных каналов на c++ передать сообщение с одного компьютера на другой. Но клиент не мог подключиться к серверу, выдавал ошибку 1326(неверное имя или пароль), хотя имя сервера указано правильно. Вопрос: какое отношение к каналу имеет пароль? И если в коде нет ошибок, то что ещё может быть причиной ошибки подключения к каналу? И ещё в интернете видел такую форму запись имени канала \servername\pipe[path]pipename. servname-имя сервера, pipe-определяет что это канал, а pipename-имя канала, но что такое [path]?
Код сервера
#include <windows.h>
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
HANDLE hNamedPipe;
DWORD dwBytesRead; // для количества прочитанных байтов
DWORD dwBytesWrite; // для количества записанных байтов
char pchMessage[80]; // для сообщения
int nMessageLength; // длина сообщения
// инициализация атрибутов безопасности
PSECURITY_DESCRIPTOR psd;
SECURITY_ATTRIBUTES sa;
psd = (PSECURITY_DESCRIPTOR)LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
InitializeSecurityDescriptor(psd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(psd, true, NULL, false);
sa.nLength = sizeof(sa);
sa.bInheritHandle = true;
sa.lpSecurityDescriptor = psd;
hNamedPipe= CreateNamedPipe("\\\\.\\pipe\\pipe", PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED | WRITE_OWNER, PIPE_READMODE_MESSAGE | PIPE_TYPE_MESSAGE| PIPE_ACCEPT_REMOTE_CLIENTS, PIPE_UNLIMITED_INSTANCES, 2048, 2048, INFINITE, &sa);
// проверяем на успешное создание
if (hNamedPipe == INVALID_HANDLE_VALUE)
{
cerr << "Create named pipe failed." << endl
<< "The last error code: " << GetLastError() << endl;
cout << "Press any key to exit.";
cin.get();
return 0;
}
// ждем, пока клиент свяжется с каналом
cout << "The server is waiting for connection with a client." << endl;
if (!ConnectNamedPipe(
hNamedPipe, // дескриптор канала
NULL // связь синхронная
))
{
cerr << "Connect named pipe failed." << endl
<< "The last error code: " << GetLastError() << endl;
CloseHandle(hNamedPipe);
cout << "Press any key to exit.";
cin.get();
return 0;
}
// читаем сообщение от клиента
if (!ReadFile(
hNamedPipe, // дескриптор канала
pchMessage, // адрес буфера для ввода данных
sizeof(pchMessage), // количество читаемых байтов
&dwBytesRead, // количество прочитанных байтов
NULL)) // передача данных синхронная
{
cerr << "Data reading from the named pipe failed." << endl
<< "The last error code: " << GetLastError() << endl;
CloseHandle(hNamedPipe);
cout << "Press any key to exit.";
cin.get();
return 0;
}
// выводим полученное от клиента сообщение на консоль
cout << "The server received the message from a client: "
<< endl << '\t' << pchMessage << endl;
// вводим строку
cout << "Input a string: ";
cin.getline(pchMessage, 80);
// определяем длину строки
nMessageLength = strlen(pchMessage) + 1;
// отвечаем клиент
if (!WriteFile(
hNamedPipe, // дескриптор канала
pchMessage, // адрес буфера для вывода данных
nMessageLength, // количество записываемых байтов
&dwBytesWrite, // количество записанных байтов
NULL // передача данных синхронная
))
{
cerr << "Write file failed." << endl
<< "The last error code: " << GetLastError() << endl;
CloseHandle(hNamedPipe);
cout << "Press any key to exit.";
cin.get();
return 0;
}
// выводим посланное клиенту сообщение на консоль
cout << "The server sent the message to a client: "
<< endl << '\t' << pchMessage << endl;
// закрываем дескриптор канала
CloseHandle(hNamedPipe);
// завершаем процесс
cout << "Press any key to exit.";
cin.get();
return 0;
}
Код клиента
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
int main()
{
string machineName;
getline(cin, machineName, '\n');
machineName= "\\\\"+machineName+"\\pipe\\pipe";
cout << machineName << endl;
char pipeName[80];
strcpy_s(pipeName, machineName.c_str());
HANDLE hNamedPipe;
DWORD dwBytesWritten; // для количества записанных байтов
DWORD dwBytesRead; // для количества прочитанных байтов
char pchMessage[80]; // для сообщения
int nMessageLength; // длина сообщения
// вводим имя машины в сети, на которой работает сервер
// подставляем имя машины в имя канала
// связываемся с именованным каналом
hNamedPipe = CreateFile(
pipeName, // имя канала
GENERIC_READ | GENERIC_WRITE, // читаем и записываем в канал
FILE_SHARE_READ | FILE_SHARE_WRITE, // разрешаем чтение и запись
NULL, // безопасность по умолчанию
OPEN_EXISTING, // открываем существующий канал
FILE_ATTRIBUTE_NORMAL, // атрибуты по умолчанию
NULL); // дополнительных атрибутов нет
// проверяем связь с каналом
if (hNamedPipe == INVALID_HANDLE_VALUE)
{
cerr << "Connection with the named pipe failed." << endl
<< "The last error code: " << GetLastError() << endl;
cout << "Press any key to exit.";
cin.get();
return 0;
}
// вводим строку
cin.get();
cout << "Input a string: ";
cin.getline(pchMessage, 80);
// определяем длину строки
nMessageLength = strlen(pchMessage) + 1;
// пишем в именованный канал
if (!WriteFile(
hNamedPipe, // дескриптор канала
pchMessage, // данные
nMessageLength, // размер данных
&dwBytesWritten, // количество записанных байтов
NULL)) // синхронная запись
{
// ошибка записи
cerr << "Write file failed: " << endl
<< "The last error code: " << GetLastError() << endl;
CloseHandle(hNamedPipe);
cout << "Press any key to exit.";
cin.get();
return 0;
}
// выводим посланное сообщение на консоль
cout << "The client sent the message to a server: "
<< endl << '\t' << pchMessage << endl;
// читаем из именованного канала
if (!ReadFile(
hNamedPipe, // дескриптор канала
pchMessage, // данные
sizeof(pchMessage), // размер данных
&dwBytesRead, // количество записанных байтов
NULL)) // синхронное чтение
{
// ошибка чтения
cerr << "Read file failed: " << endl
<< "The last error code: " << GetLastError() << endl;
CloseHandle(hNamedPipe);
cout << "Press any key to exit.";
cin.get();
return 0;
}
// выводим полученное сообщение на консоль
cout << "The client received the message from a server: "
<< endl << '\t' << pchMessage << endl;
// закрываем дескриптор канала
CloseHandle(hNamedPipe);
// завершаем процесс
cout << "Press any key to exit.";
cin.get();
return 0;
}