Member 12711426 Ответов: 1

Ошибка, возникающая при чтении сообщения с сервера


Я создал одно серверное приложение и одно клиентское приложение, в то время как я отправляю клиент формы сообщения на сервер, я получаю сообщение "ошибка произошла при чтении сообщения 109".,

Что я уже пробовал:

здесь я попробовал свой серверный и клиентский код ниже,

серверный код:-


#include "stdafx.h"
#include<Windows.h>
#include<iostream>
using namespace std;

#define g_szPipeName "\\\\.\\pipe\\pipename"
#define BUFFER_SIZE 500
#define ACK_MESSAGE_RECV "Message received sucessfully"

HANDLE hPipe;

class NamedPipeServerApplication
{
public:
	int repeat()
	{
		char szBuffer[BUFFER_SIZE];
		DWORD cbBytes;

		BOOL bResult = ReadFile(hPipe,szBuffer,sizeof(szBuffer),&cbBytes,NULL);
		if((bResult) || (0==cbBytes))
		{
			cout<<"Error occured while reading from the client"<<GetLastError()<<endl;
			CloseHandle(hPipe);
			//system("pause");
			return 1;

		}
		else 
		{
			cout<<"ReadFile  was sucessful"<<endl;
		}
		cout<<"Client sent the following message :"<<szBuffer<<endl;
		strcpy(szBuffer,ACK_MESSAGE_RECV);
		bResult = WriteFile(hPipe,szBuffer,strlen(szBuffer),&cbBytes,NULL); 

		if((!bResult) || strlen(szBuffer) != cbBytes)
		{
			cout<<"Error occured while writing the client code"<<GetLastError()<<endl;
			CloseHandle(hPipe);
			//system("pause");
			return 1;
		}
		else
		{
			cout<<"WriteFile was sucessful"<<endl;
		}
		repeat();
	}
};
int _tmain(int argc, _TCHAR* argv[])
{
	NamedPipeServerApplication Server;

	hPipe = CreateNamedPipe(g_szPipeName,PIPE_ACCESS_DUPLEX,PIPE_TYPE_MESSAGE |
						PIPE_READMODE_MESSAGE | PIPE_WAIT,PIPE_UNLIMITED_INSTANCES,
						BUFFER_SIZE,BUFFER_SIZE,NMPWAIT_USE_DEFAULT_WAIT,NULL);

	if(INVALID_HANDLE_VALUE == hPipe)
	{
		cout<<"Error occured while creating the pipe"<<GetLastError()<<endl;
		//system("pause");
		return 1;
	}
	else
	{
		cout<<"CreateNamedPipe() was sucessful"<<endl;
	}
	cout<<"waiting for the client connection...."<<endl;
	BOOL bClientConnected = ConnectNamedPipe(hPipe,NULL);

	if(FALSE== bClientConnected)
	{
		cout<<"Error occured while connecting to the client "<<GetLastError()<<endl;
		//system("pause");
		return 1;
	}
	else
	{
		cout<<"ConnectNamePipe() was sucessfull"<<endl;
	}

	Server.repeat();
	return 0;
}


и мой клиентский код :-

#include "stdafx.h"
#include<iostream>
#include<Windows.h>
using namespace std;

#define g_szPipeName "\\\\.\\pipe\\pipename"

#define BUFFSIZE 500
#define ACK_MESG_RECV  "Message received sussefully"

HANDLE hPipe;
BOOL bResult;

class NamedPipeClient
{
public:
	
	int repeat()
	{
		char szBuffer[BUFFSIZE];
		cout<<"\nEnter a message to be sent to the server: ";
		gets(szBuffer);
		
		DWORD cbBytes;
		BOOL bResult = WriteFile(hPipe,szBuffer,strlen(szBuffer),&cbBytes,NULL);    
	
	if ((!bResult) || (strlen(szBuffer) != cbBytes))
		{
		cout<<"\nError occurred while writing to the server:"<< GetLastError()<<endl;
		CloseHandle(hPipe);
		system("Pause");
		return 1; 
		}
		else
			{
			cout<<"\nWriteFile was successful."<<endl;
			}
			bResult = ReadFile(hPipe,szBuffer,sizeof(szBuffer),&cbBytes,NULL);  

		if ((!bResult) || (0 == cbBytes))
		{
			cout<<"\nError occurred while reading from the server: "<<GetLastError()<<endl;
			CloseHandle(hPipe);
			system("Pause");
			return 1; 
		}
		else
			{
				cout<<"\nReadFile was successful."<<endl;
			}
				cout<<"\nServer sent the following message: %s"<<szBuffer<<endl;
				repeat();
	}
		

};


int _tmain(int argc, _TCHAR* argv[])
{
	NamedPipeClient Client;

	hPipe = CreateFile( 
          g_szPipeName,  
          GENERIC_READ |			 
          GENERIC_WRITE, 
          0,              
          NULL,           
          OPEN_EXISTING,   
          0,              
          NULL);

	 if (INVALID_HANDLE_VALUE == hPipe) 
     {
          cout<<"\nError occurred while connecting to the server: "<<GetLastError(); 
         
		  system("Pause");
          return 1;
     }
     else
     {
          cout<<"\nCreateFile was successful."<<endl;
     }
	Client.repeat(); 
	return 0;
}

0x01AA

Последняя Ошибка 109:
Коды системных ошибок (0-499) - приложения Windows | Microsoft Docs[^]
-> ERROR_BROKEN_PIPE 109 (0x6D) труба была закончена.

Rick York

Использование глобального дескриптора для трубы - действительно плохая идея. Как минимум, это должен быть аргумент, передаваемый методу repeat. Большинство людей сделали бы его членом класса и поместили бы вызов CreateFile также в класс.

1 Ответов

Рейтинг:
1

KarstenK

Вам нужно использовать отладчик, чтобы увидеть, что происходит, и прочитать некоторую документацию. Там вы бы прочитали о сообщении об ошибке.

Искусство программирования состоит в том, чтобы изящно справляться с ошибками и восстанавливать связь. Вам также нужно исправить код сервера, который также должен удалить канал и поэтому может повторно подключиться.

Подумайте о том, чтобы использовать некоторые сокеты программирования, как описано в этой статье Программирование сокетов Windows TCP на языке C++ для начинающих,