Socket相似支持网络之间不同进程的通信
客户端
void CChildView::OnCreateNamedPipe()
{
// TODO: 在此添加命令处理程序代码
//1 创建一个命名管道
LPCTSTR szPipeName=TEXT("\\\\.\\pipe\\mypipe");
hNamedPipe=CreateNamedPipe(szPipeName,PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,
PIPE_TYPE_BYTE,1,1012,1024,0,NULL);
if(hNamedPipe ==INVALID_HANDLE_VALUE){
printf("CreateNamedPipe failed with %d\n",GetLastError());
MessageBox(_T("创建命名管道失败"));
return;
}
//2 等待客户端的连接
HANDLE hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if(NULL==hEvent){
MessageBox(_T("创建事件失败"));
CloseHandle(hNamedPipe);
hNamedPipe=NULL;
return;
}
OVERLAPPED ovlap;
ZeroMemory(&ovlap,sizeof(OVERLAPPED));
ovlap.hEvent=hEvent;
//等待连接
if(!ConnectNamedPipe(hNamedPipe,&ovlap)){
if(ERROR_IO_PENDING!=GetLastError()){
MessageBox(_T("等待客户端连接失败"));
CloseHandle(hNamedPipe);
CloseHandle(hEvent);
hNamedPipe=NULL;
hEvent=NULL;
return;
}
}
if(WaitForSingleObject(hEvent,INFINITE)==WAIT_FAILED){
if(ERROR_IO_PENDING!=GetLastError()){
MessageBox(_T("等待对象失败"));
CloseHandle(hNamedPipe);
CloseHandle(hEvent);
hNamedPipe=NULL;
hEvent=NULL;
return;
}
}
}
void CChildView::OnSreadNamedPipe()
{
// TODO: 在此添加命令处理程序代码
char szBuf[100]={0};
DWORD dwRead;
if(!ReadFile(hNamedPipe,szBuf,100,&dwRead,NULL))
{
MessageBox(_T("读取数据失败"));
return;
}
MessageBox((CStringW)szBuf);
}
void CChildView::OnSwriteNamedPipe()
{
// TODO: 在此添加命令处理程序代码
//写入数据
char szBuf[100]="OnNamedPipe Server";
DWORD dwWrite;
if(!WriteFile(hNamedPipe,szBuf,strlen(szBuf+1),&dwWrite,NULL))
{
MessageBox(_T("写入数据失败"));
return;
}
MessageBox(_T("写入数据成功"));
}
服务端
void CChildView::OnConnectNameedPipe()
{
// TODO: 在此添加命令处理程序代码
//创建一个文件句柄
LPCTSTR szNamedPipe=TEXT("\\\\.\\pipe\\mypipe");
if(0==WaitNamedPipe(szNamedPipe,NMPWAIT_WAIT_FOREVER)){
MessageBox(_T("当前没有可以利用的管道"));
return;
}
hNamedPipe=CreateFile(szNamedPipe,GENERIC_READ|GENERIC_WRITE,
0,NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,NULL);
if(hNamedPipe==INVALID_HANDLE_VALUE){
printf("CreateMailslot failed with %d\n",GetLastError());
MessageBox(_T("打开命名管道失败!"));
hNamedPipe=NULL;
return;
}
}
void CChildView::OnReadNameedPipe()
{
// TODO: 在此添加命令处理程序代码
char szBuf[100]={0};
DWORD dwRead;
if(!ReadFile(hNamedPipe,szBuf,100,&dwRead,NULL))
{
MessageBox(_T("读取数据失败"));
return;
}
MessageBox((CStringW)szBuf);
}
void CChildView::OnWriteNameedPipe()
{
// TODO: 在此添加命令处理程序代码
//写入数据
char szBuf[100]="NAMEDPIPE CLIENT";
DWORD dwWrite;
if(!WriteFile(hNamedPipe,szBuf,strlen(szBuf+1),&dwWrite,NULL))
{
MessageBox(_T("写入数据失败"));
return;
}
MessageBox(_T("写入数据成功"));
}