Hi...
I'm trying to send a message to a server using a named pipe. I managed to send a message from the client application to the server application in the same machine. But when i try sending the message with the server application in another machine it returns false in the WaitNamedPipe() function :(
I have turned off both machines firewall, i can ping both machines and the ip address of the server is correct.
What can be the problem?
Here is the code for my Cliente and Server App:
CLIENT
SERVERCode:int main(int argc, char* argv[])
{
HANDLE hPipe;
DWORD dwReadWritten;
DWORD dwMode=PIPE_READMODE_MESSAGE|PIPE_WAIT;
char buffer[1024];
char *pszPipe="\\\\192.168.1.82\\pipe\\ServNT";
if (!WaitNamedPipe(pszPipe, NMPWAIT_WAIT_FOREVER))
{
printf("CLIENT: Error connecting\n");
return 1;
}
printf("CLIENT: Connect to server\n");
hPipe = CreateFile(pszPipe, GENERIC_WRITE|GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hPipe==NULL)
{
printf("CLIENT: Error a connecting \n");
return 1;
}
if (!SetNamedPipeHandleState(hPipe,&dwMode,NULL,NULL))
{
printf("CLIENT: Error SetNamedPipeHandleState\n");
return 1;
}
while (1)
{
printf("Frase: ");
gets_s(buffer,1024);
buffer[lstrlen(buffer)]=0;
if (!strncmp(buffer,"end",3))
break;
/*if (!WriteFile(hPipe, buffer, strlen(buffer)+1,
&dwReadWritten, NULL)) {
printf("CLIENT: Error WriteFile\n");
return 1;
}
if (!ReadFile(hPipe, buffer, 1024,
&dwReadWritten, NULL)) {
printf("CLIENT: Error ReadFile%d\n",GetLastError());
return 1;
}*/
if (!TransactNamedPipe(hPipe, buffer, lstrlen(buffer)+1,
buffer, 1024,
&dwReadWritten, NULL)) {
printf("CLIENT: Error WriteFile\n");
return 1;
}
printf("\nResponse: %s\n",buffer);
}
printf("CLIENT: turn off pipe\n");
CloseHandle(hPipe);
return 0;
}
Code:void main( )
{
SERVICE_TABLE_ENTRY DispatchTable[] =
{
{ NOME_DO_SERVICO, MyServiceStart },
{ NULL, NULL }
};
if (!StartServiceCtrlDispatcher( DispatchTable))
{
ShowError(" [ServNT] StartServiceCtrlDispatcher error = %d\n", GetLastError());
}
}
void WINAPI MyServiceStart (DWORD argc, LPTSTR *argv)
{
HANDLE hPipe;
OVERLAPPED ovl;
MyServiceStatus.dwServiceType = SERVICE_WIN32;
MyServiceStatus.dwCurrentState = SERVICE_START_PENDING;
MyServiceStatus.dwControlsAccepted = 0;
MyServiceStatus.dwWin32ExitCode = 0;
MyServiceStatus.dwServiceSpecificExitCode = 0;
MyServiceStatus.dwCheckPoint = 0;
MyServiceStatus.dwWaitHint = 0;
MyServiceStatusHandle = RegisterServiceCtrlHandler(NOME_DO_SERVICO, MyServiceCtrlHandler);
if ( MyServiceStatusHandle == (SERVICE_STATUS_HANDLE) 0 )
{
MostrarErro(" [ServNT] RegisterServiceCtrlHandler failed %d\n", GetLastError());
return;
}
if ( !SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus) )
{
status = GetLastError();
MostrarErro(" [ServNT] SetServiceStatus error %ld\n", status);
}
// Initialization code goes here.
Event=CreateEvent(NULL,FALSE,FALSE,NULL); //semaforo binário
if (Event==NULL)
{
MyServiceStatus.dwCurrentState = SERVICE_STOPPED;
MyServiceStatus.dwCheckPoint = 0;
MyServiceStatus.dwWaitHint = 0;
MyServiceStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;
MyServiceStatus.dwServiceSpecificExitCode = 0x1234;
SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus);
return;
}
// Initialization complete - report running status.
MyServiceStatus.dwCurrentState = SERVICE_RUNNING;
MyServiceStatus.dwCheckPoint = 0;
MyServiceStatus.dwWaitHint = 0;
MyServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP/* | SERVICE_ACCEPT_PAUSE_CONTINUE*/;
if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus))
{
status = GetLastError();
ShowError(" [ServNT] SetServiceStatus error %ld\n",status);
}
// This is where the service does its work.
ShowError(" [ServNT] Waiting for clients \n",0);
flag=TRUE;
while(flag)
{
hPipe = CreateNamedPipe("\\\\.\\pipe\\ServNT",
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED | FILE_FLAG_WRITE_THROUGH, PIPE_WAIT |
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE, PIPE_UNLIMITED_INSTANCES, 1024, 1024, 1000, NULL);
if (!hPipe)
break;
ovl.hEvent=Event;
ConnectNamedPipe(hPipe, &ovl);
WaitForSingleObject(Event, INFINITE);
if (!flag)
break;
CreateThread(NULL, 0, MyServiceProc, hPipe, 0, NULL);
}
CloseHandle(hPipe);
CloseHandle(Event);
MyServiceStatus.dwCurrentState = SERVICE_STOPPED;
MyServiceStatus.dwCheckPoint = 0;
MyServiceStatus.dwWaitHint = 0;
if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus))
{
status = GetLastError();
ShowError("[ServNT] SetServiceStatus error %ld\n", status);
}
return;
}
VOID WINAPI MyServiceCtrlHandler (DWORD Opcode)
{
switch(Opcode)
{
case SERVICE_CONTROL_PAUSE:
// Do whatever it takes to pause here.
// MyServiceStatus.dwCurrentState = SERVICE_PAUSED;
break;
case SERVICE_CONTROL_CONTINUE:
// Do whatever it takes to continue here.
// MyServiceStatus.dwCurrentState = SERVICE_RUNNING;
break;
case SERVICE_CONTROL_STOP:
// Do whatever it takes to stop here.
MyServiceStatus.dwWin32ExitCode = 0;
MyServiceStatus.dwCurrentState = SERVICE_STOP_PENDING;
MyServiceStatus.dwCheckPoint = 0;
MyServiceStatus.dwWaitHint = 0;
if (!SetServiceStatus (MyServiceStatusHandle,
&MyServiceStatus))
{
status = GetLastError();
MostrarErro(" [ServNT] SetServiceStatus error %ld\n",status);
}
flag=FALSE;
SetEvent(Event);
ShowError(" [ServNT] Leaving MyService \n",0);
return;
case SERVICE_CONTROL_INTERROGATE:
// Fall through to send current status.
break;
default:
ShowError(" [ServNT] Unrecognized opcode %ld\n",
Opcode);
break;
}
// Send current status.
if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus))
{
status = GetLastError();
ShowError(" [ServNT] SetServiceStatus error %ld\n",status);
}
return;
}
DWORD WINAPI MyServiceProc(LPVOID param) //alterar para o nosso codigo/serviço
{
char buffer[1024];
HANDLE hPipe=(HANDLE) param;
DWORD dwReadWrite;
BOOL ret = FALSE;
ShowError("Vou entrar na Thread\n",0);
while(flag)
{
buffer[0]=0;
ret = ReadFile(hPipe, buffer, 1024, &dwReadWrite, NULL);
if (!ret || !dwReadWrite)
{
status = GetLastError();
MostrarErro(" [ServNT] ReadFile error %ld\n", status);
break;
}
lstrcat(buffer, "...Ok!!!");
ShowError(buffer,0);
ret = WriteFile(hPipe, buffer, lstrlen(buffer)+1, &dwReadWrite, NULL);
if (!ret || !dwReadWrite)
{
status = GetLastError();
ShowError(" [ServNT] WriteFile error %ld\n", status);
break;
}
}
DisconnectNamedPipe(hPipe);
CloseHandle(hPipe);
ShowError(" [ServNT] Getting out of Thread\n",0);
return 0L;
}
HANDLE hEventSource;
void ShowError(LPSTR str,DWORD val)
{
char buf[1024];
LPSTR msg[2]={buf,NULL};
wsprintf(buf,str,val);
if (!hEventSource)
{
hEventSource = RegisterEventSource(NULL, // local machine
NOME_DO_SERVICO); // source name
}
if (hEventSource)
{
ReportEvent(hEventSource,
EVENTLOG_INFORMATION_TYPE,
0,
0,
NULL, // sid
1,
0,
(const char **)msg,
NULL);
}
}