• 命名管道不能实现局域网内通信,该怎么处理


    原文链接: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);
            }
                
    }






  • 相关阅读:
    2014-12-13 ~ 2015-11-13
    Burnside引理与polya定理
    HDU 5418 Victor and World (状态压缩dp)
    HDU 5446 Unknown Treasure(lucas + 中国剩余定理 + 模拟乘法)
    HDU 5412 CRB and Queries (整体二分)
    LA 4327 Parade(单调队列优化dp)
    win7远控控制桌面防火墙设置到例外
    win7远控控制桌面
    TCP的三次握手和四次挥手
    ES6 for in与for of 的使用方法及其区别
  • 原文地址:https://www.cnblogs.com/huhu0013/p/10740600.html
Copyright © 2020-2023  润新知