2016-12-11 3 views
0

Я сделал сервер и клиент в winapi.Трубы не работают в WinApi на Windows 7, но работают на Windows 10

Клиент отправляет номер и базу, и сервер возвращает номер в этой базе. Windows7 error Моя проблема в том, что он работает в Windows 10, но он не работает в Windows 7, и я не понимаю, почему. Некоторая помощь?

Клиент:

#include "stdafx.h" 
#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 
#include <fstream> 
#include <assert.h> 
#include <windows.h> 
#include <string> 

#define BUFFSIZE 512 
using namespace std; 


int main() 
{ 
    LPDWORD bytesRead = 0; 
    char res[50]; 
    int num, base; 

    LPCTSTR Roura = TEXT("\\\\.\\pipe\\pipeline"); 
    HANDLE h = CreateFile(Roura, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 


    while (true) { 
     for (int i = 0; i < 50; i++) { 
      res[i] = 0; 
     } 
     printf("Number: "); 
     cin >> num; 
     WriteFile(h, &num, sizeof(int), NULL, NULL); 
     if (num == 0) { 
      CloseHandle(h); 
      return 0; 
     } 
     printf("Base: "); 
     cin >> base; 
     WriteFile(h, &base, sizeof(int), NULL, NULL); 
     ReadFile(h, res, BUFFSIZE, bytesRead, NULL); 
     cout << res << endl; 
    } 

    return 0; 
} 

Сервер:

#include "stdafx.h" 
#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 
#include <fstream> 
#include <assert.h> 
#include <windows.h> 
#include <string> 

#define _CRT_SECURE_NO_WARNINGS 
#define BUFFSIZE 512 
using namespace std; 


int main() 
{ 
    int num, base; 
    LPDWORD bytesRead = 0; 
    char result[50]; 
    char end[] = {"\0"}; 

    LPCTSTR Roura = TEXT("\\\\.\\pipe\\pipeline"); 

    HANDLE h = CreateNamedPipe(Roura, PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, 1, BUFFSIZE, BUFFSIZE, 0, NULL); 


    assert(h != INVALID_HANDLE_VALUE); 

    if (!ConnectNamedPipe(h, NULL)) return -1; 

    while (true) { 
     ReadFile(h, &num, BUFFSIZE, bytesRead, NULL); 
     if (num == 0) { 
      CloseHandle(h); 
      return 0; 
     } 
     ReadFile(h, &base, BUFFSIZE, bytesRead, NULL); 
     _itoa(num, result, base); 
     WriteFile(h, result, strlen(result), NULL, NULL); 
    } 

    return 0; 
} 
+0

Где ваша [обработка ошибок] (http://stackoverflow.com/documentation/winapi/2573/error-reporting-and-handling#t = +201612112131423457057)? – IInspectable

+1

Начните с проверки на наличие ошибок. Все ли «ReadFile» и «WriteFile» преуспевают? Вы не знаете. И если кто-то терпит неудачу, вызовите 'GetLastError', чтобы узнать, почему. –

+0

@CareyGregory Я не могу понять, почему он работает в Windows10 и Windows7 падает. –

ответ

3
#define BUFFSIZE 512 
int num, base; 
LPDWORD bytesRead = 0; 
ReadFile(h, &num, BUFFSIZE, bytesRead, NULL); 

это полный код ошибки. необходимо использовать

int num, base; 
DWORD bytesRead; 
ReadFile(h, &num, sizeof(num), &bytesRead, NULL); 

вместо этого. врезаться быстрее всего, bytesRead== 0

когда

Если lpOverlapped является NULL, lpNumberOfBytesRead не может быть NULL.

однако это верно на win7, но сказать win10 - система пусть нет lpNumberOfBytesRead == 0 - так нет аварии здесь

также этот

WriteFile(h, &num, sizeof(int), NULL, NULL); 

снова - вот уже только 1 ошибка сравнения ReadFile вызова

Если lpOverlapped равен NULL, lpNumberOfBytesWritten не может быть NULL.

Почему?

, что он работает в Windows 10, но он не работает в Windows 7

это потому, что начинается с победы 8.1 (, если я не ошибаюсь) код ReadFile/WriteFile проверки lpNumberOfBytes параметр, и если он ==0 не присваивает ему фактическое количество прочитанных или записанных байтов. но в Windows 7 система не выполняет эту проверку и безоговорочно записывает данные по 0 адресу

+0

Это все еще грохот! –

+0

('WriteFile (h, & num, sizeof (int), NULL, NULL);) Я узнал, что после этого клиент WriteFails сбрасывает –

+0

@ValentinEmilCudelcu - конечно по той же причине 3-й параметр равен 0 – RbMm