命名管道不能实现局域网内通信,该怎么处理
原文链接:http://www.myexception.cn/vc-mfc/304571.html
命名管道不能实现局域网内通信,该怎么处理
www.MyException.Cn 网友分享于:2015-08-26 浏览:157次
服务器端创建命名管道:
hPipe=CreateNamedPipe("\\\\.\\pipe\\MyPipe",
PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,
0,1,1024,1024,0,NULL);
if(hPipe==INVALID_HANDLE_VALUE)
{
MessageBox("Failed to create named pipe!");
hPipe=NULL;
return;
}
HANDLE hEvent;
hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if(!hEvent)
{
MessageBox("Failed to create event!");
CloseHandle(hPipe);
hPipe=NULL;
return;
}
OVERLAPPED ovlap;
ZeroMemory(&ovlap,sizeof(OVERLAPPED));
ovlap.hEvent=hEvent;
if(!ConnectNamedPipe(hPipe,&ovlap))
{
if(GetLastError()!=ERROR_IO_PENDING)
{
MessageBox("Failed to wait for client!");
CloseHandle(hPipe);
CloseHandle(hEvent);
hPipe=NULL;
return;
}
}
if(WaitForSingleObject(hEvent,INFINITE)==WAIT_FAILED)
{
MessageBox("Failed to wait for event!");
CloseHandle(hPipe);
CloseHandle(hEvent);
hPipe=NULL;
return;
}
CloseHandle(hEvent);
客户端创建命名管道:
if(!WaitNamedPipe("\\\\UT\\pipe\\MyPipe",NMPWAIT_WAIT_FOREVER))
{
MessageBox("No available pipe!");
return;
}
hPipe=CreateFile("\\\\UT\\pipe\\MyPipe",GENERIC_READ|GENERIC_WRITE,
0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hPipe==INVALID_HANDLE_VALUE)
{
MessageBox("Failed to open named pipe!");
hPipe=NULL;
return;
}
其中UT为服务器主机名。以上两个程序是照孙鑫的《VC++深入详解》抄的。
把这两个程序都放在同一个机子上可以通信。但放在局域网的两个主机上就不能通信了,请问为什么?错在哪?
------解决方案--------------------
看似乎否有防火墙等拦截..
------解决方案--------------------
代码似乎没看出什么问题
------解决方案--------------------
我试验的结果是,如果直接连,很可能连不上,
但如果你用 win键 + R ,然后输入目标机器地址,手动连接到目标机器上
然后再运行程序就可以连上了
------解决方案--------------------
先与目标机器建立IPC连接试试看
一种办法是在程序中执行命令
net use \\ip\\ipc$ password /user:user
user和password是你用于访问的用户名和密码
另一种办法是用下面的程序建立IPC连接
- C/C++ code
BOOL ConnetIPC(char * RemoteName,char * User,char * PassWord) { char tmp[128]="\\\\"; strcat(tmp,RemoteName); strcat(tmp,"\\ipc$"); NETRESOUCE NetResouce; NetResouce.lpRemoteName=tmp; NetResouce.dwType=RESOURCETYPE_ANY; NetResouce.lpProvider=NULL; if (WnetAddConnection2(&NetResouce,PassWord,User,FLASE)==NO_ERROR) //建立连接! return FALSE; else return TRUE; }
------解决方案--------------------
- C/C++ code
SECURITY_ATTRIBUTES sa; SECURITY_DESCRIPTOR sd; if( InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION) ) { // add a NULL disc. ACL to the // security descriptor. if (SetSecurityDescriptorDacl(&sd, TRUE, (PACL) NULL, FALSE)) { sa.nLength = sizeof(sa); sa.lpSecurityDescriptor =&sd; sa.bInheritHandle = TRUE; //在这里 CreateNamedPipe(.......&sa); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2014-04-20 伪随机数