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); } }



LinkBack URL
About LinkBacks





