#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;
}
进程间通信之双管道
最新推荐文章于 2023-04-16 23:46:31 发布