[VC++] probleme avec le Pipe Named
En fait, je suis entrainde developper une application qui peut se comporter comme server et une appli de test qui se comporte comme client. pour l'architecture client/server, j'ai utilisé les PipeNamed et pour cela j'ai implementé mon server comme suit :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| typedef struct
{
OVERLAPPED oOverlap;
HANDLE hPipeInst;
TCHAR chRequest[BUFSIZE];
DWORD cbRead;
TCHAR chReply[BUFSIZE];
DWORD cbToWrite;
} PIPEINST, *LPPIPEINST;
HANDLE hPipe;
BOOL fSuccess, fPendingIO;
LPPIPEINST lpPipeInst;
DWORD dwWait, cbRet;
OVERLAPPED oConnect;
extern "C" EXPORT void cpaServerCommStart(cpaServerCommLibHandleT cpaServerCommLibHandle)
{
// struct timeval timeout;
cpaMessageHeaderT * mess=NULL;
// bool HandleExist;
oConnect.hEvent = CreateEvent( NULL, TRUE, TRUE, NULL);
if (oConnect.hEvent == NULL)
{
printf("CreateEvent failed with %d.\n", GetLastError());
char KTxtCountServer[] = "CPAServer";
printf ("CPAServer");
exit(-1);
}
fPendingIO = CreateAndConnectInstance(&oConnect);
printf ("Server Connected.\n");
while (1)
{
//timeout.tv_sec = 60;
//timeout.tv_usec = 0;
dwWait = WaitForSingleObjectEx( oConnect.hEvent, INFINITE, TRUE);
switch (dwWait)
{
// The wait conditions are satisfied by a completed connect
// operation.
case 0:
// If an operation is pending, get the result of the
// connect operation.
if (fPendingIO)
{
fSuccess = GetOverlappedResult(hPipe, &oConnect, &cbRet, FALSE);
if (!fSuccess)
{
printf("ConnectNamedPipe (%d)\n", GetLastError());
exit(-1);
// return 0;
}
}
// Allocate storage for this instance.
lpPipeInst = (LPPIPEINST) GlobalAlloc(GPTR, sizeof(PIPEINST));
if (lpPipeInst == NULL)
{
printf("GlobalAlloc failed (%d)\n", GetLastError());
exit(-1);
// return 0;
}
lpPipeInst->hPipeInst = hPipe;
lpPipeInst->cbToWrite = 0;
mess = cpaCommReadMessage(lpPipeInst->hPipeInst);
if (mess!=NULL){
printf("\nserver - Pipe Handle : %p \n", lpPipeInst->hPipeInst);
if(lib_handle.cpaClientConnectCB)
lib_handle.cpaClientConnectCB((cpaServerConnHandleT)lpPipeInst->hPipeInst);
if(lib_handle.cpaServerHandleMsgCB)
lib_handle.cpaServerHandleMsgCB((cpaServerConnHandleT)lpPipeInst->hPipeInst,mess);
}
// Create new pipe instance for the next client.
fPendingIO = CreateAndConnectInstance( &oConnect);
break;
// The wait is satisfied by a completed read or write
// operation. This allows the system to execute the
// completion routine.
case WAIT_IO_COMPLETION: break;
// An error occurred in the wait function.
default:
{
printf("WaitForSingleObjectEx (%d)\n", GetLastError());
// return 0;
}
}
}
} |
et mon client comme suit :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| extern "C"
EXPORT cpaClientConnHandleT cpaClientCommOpenConnection(void)
{
// Try to open a named pipe; wait for it, if necessary.
while (1)
{
hPipe = CreateFile(lpszPipename, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, 0, NULL);
// Break if the pipe handle is valid.
if (hPipe != INVALID_HANDLE_VALUE)
break;
// Exit if an error other than ERROR_PIPE_BUSY occurs.
if (GetLastError() != ERROR_PIPE_BUSY)
{
printf("Could not open busy pipe\n");
return NULL;
}
// All pipe instances are busy, so wait for 20 seconds.
if (!WaitNamedPipe(lpszPipename, 20000))
{
printf("Could not open pipe\n");
return NULL;
}
}
// The pipe connected; change to message-read mode.
dwMode = PIPE_READMODE_MESSAGE;
fSuccess = SetNamedPipeHandleState( hPipe, &dwMode, NULL, NULL);
if (!fSuccess)
{
printf("SetNamedPipeHandleState failed\n");
return NULL;
}
printf ("Connexion Established\n");
printf("Client - Pipe Handle : %p\n",hPipe);
return hPipe;
} |
de toute façon je me suis inspiré des exemple que j'ai trouve sur les msdn.
mais le probleme c'est que on peut fairequ'une fois la communication entre le client et le server.
je m'explique :
1 - le server se met en attente, puis le client se connecte.
2 - a la connexion le client envoie un message au server.
3 - le server recoit le message et envoie un message de confirmation de sa part au client.
4 - apres le client essaye d'envoyer un autre message sur le meme pipe. mais ca ne marche pas.
je ne sais pas est ce que le message ne s'envoie pas ou c'est le serveur qui le recoit pas.
est ce qu'il y a quelqu'un qui peut m'aider pour regler ca.
je veux configurer mon pipe pour pouvoir envoyer et recevoir plusieurs message de chaque coté.
comment pourrai-je faire ca ?