repo: atende cliente OverLappedIO
Cliente:
#include <Windows.h> #include <tchar.h> #include <math.h> #include <stdio.h> #include <fcntl.h> #include <io.h> #include <time.h> #include "..\cliente\util.h" DWORD WINAPI leResposta(LPVOID lpData) { HANDLE hPipe = (HANDLE)lpData; TCHAR szStr[TAM]; DWORD dwLidos, res; OVERLAPPED ov; HANDLE hEvento; hEvento = CreateEvent(NULL, TRUE, FALSE, NULL); //ultimo NULL evento local à thread não peciso de nome do { ZeroMemory(&ov, sizeof(ov)); ov.hEvent = hEvento; //ResetEvent(hEvent); res = ReadFile(hPipe, szStr, TAM, &dwLidos, &ov); //nao fico à espera agora, fica agendada a operação if (res) { _tprintf(_T("foi realizada de imediato...\n")); } if (!res && GetLastError() == ERROR_IO_PENDING) { //proteção _tprintf(_T("a aguardar informação...\n")); /* .... */ WaitForSingleObject(ov.hEvent, INFINITE); GetOverlappedResult(hPipe, &ov, &dwLidos, FALSE); } _tprintf(_T("Recebi: %s (%d)\n"), szStr, dwLidos); } while (_tcscmp(szStr, _T("SAIR")) != 0); return 0; } int _tmain(int argc, TCHAR* argv[]) { HANDLE hPipe; TCHAR szStr[TAM]; DWORD dwEscritos; #ifdef UNICODE _setmode(_fileno(stdin), _O_WTEXT); _setmode(_fileno(stdout), _O_WTEXT); _setmode(_fileno(stderr), _O_WTEXT); #endif while (1) { //ligar ao servidor hPipe = CreateFile(NOME_PIPE, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (hPipe != INVALID_HANDLE_VALUE) { break; } if (!WaitNamedPipe(NOME_PIPE, 10000)) { //espera 10 segundos _tprintf(_T("[erro] named pipe nao existe ")); } } //thread para ler resposta HANDLE hThread; DWORD dwTid; hThread = CreateThread(NULL, 0, leResposta, (LPVOID)hPipe, 0, &dwTid); OVERLAPPED ov; HANDLE hEvento; hEvento = CreateEvent(NULL, TRUE, FALSE, NULL); //thread inicial do { _tprintf(_T("TEXTO: ")); if (_fgetts(szStr, TAM, stdin) == NULL) { break; } szStr[_tcslen(szStr) - 1] = _T('\0'); ZeroMemory(&ov, sizeof(ov)); //limpar ov.hEvent = hEvento; //atribuir //ResetEvent(hEvent)//nao é necessário WriteFile(hPipe, szStr, ((DWORD)_tcslen(szStr) + 1) * sizeof(TCHAR), &dwEscritos, &ov); //envia info para o servidor, e não bloqueia. dwEscritos total de bytes escritos //devia verificar e //true correu bem //true: correu bem //false: correu mal //getpasteerror, que a oepração foi agendada /* .. podemos fazer o que quiseremos não é tão critico.. */ WaitForSingleObject(ov.hEvent, INFINITE);//esperar que o evento seja assinalado GetOverlappedResult(hPipe, &ov, &dwEscritos, FALSE); //esperar que o write foi concluido. dwEscritos verificar se o numero de bytes foram escritos _tprintf(_T("Enviei: %s (%d)\n"), szStr, dwEscritos); } while (_tcscmp(szStr, _T("SAIR")) != 0); return 0; }
Servidor:
#include <Windows.h> #include <tchar.h> #include <math.h> #include <stdio.h> #include <fcntl.h> #include <io.h> #include <time.h> #include "..\cliente\util.h" DWORD WINAPI atendeCliente(LPVOID lpData) { HANDLE hPipe = (HANDLE)lpData; TCHAR szStr[TAM]; DWORD dwLidos, dwEscritos; _tprintf(_T("Cliente ligado...\n")); while (1) { if (!ReadFile(hPipe, szStr, TAM, &dwLidos, NULL)) { //lê pedido.. break; } _tprintf(_T("Recebi: %s (%d)\n"), szStr, dwLidos); CharUpperBuff(szStr, dwLidos/sizeof(TCHAR)); //processa WriteFile(hPipe, szStr, dwLidos, &dwEscritos, NULL); //envia resposta _tprintf(_T("Enviei: %s (%d)\n"), szStr, dwEscritos); } _tprintf(_T("O cliente desligou...\n")); FlushFileBuffers(hPipe); DisconnectNamedPipe(hPipe); CloseHandle(hPipe); return 0; } int _tmain(int argc, TCHAR* argv[]) { HANDLE hPipe; DWORD dwTid; #ifdef UNICODE _setmode(_fileno(stdin), _O_WTEXT); _setmode(_fileno(stdout), _O_WTEXT); _setmode(_fileno(stderr), _O_WTEXT); #endif while (1) { //cada vez que um cliente se ligar é criada uma nova thread hPipe = CreateNamedPipe( NOME_PIPE, PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, BUFFSIZE, BUFFSIZE, 10000, NULL); if (ConnectNamedPipe(hPipe, NULL)) { CreateThread(NULL, 0, atendeCliente, (LPVOID)hPipe, 0, &dwTid); } } return 0; }
Util:
#define TAM 100 #define NOME_PIPE TEXT("\\\\.\\pipe\\teste") #define BUFFSIZE 1024
0 thoughts on “repo: atende cliente OverLappedIO”