.NET进程通信机制——邮槽

 win32api包装

using  System;
using  System.Runtime.InteropServices;

namespace  WindowsApplication2
{
    
/// <summary>
    
/// Win32 的摘要说明。
    
/// </summary>

    internal class Win32
    
{
        
public static readonly IntPtr MAILSLOT_WAIT_FOREVER = new IntPtr(-1);
        
public static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);

        [DllImport(
"kernel32.dll")]
        
public static extern IntPtr CreateMailslot(string lpName, uint nMaxMessageSize,
            IntPtr lReadTimeout, IntPtr lpSecurityAttributes);

        [DllImport(
"kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)]
        
public static extern IntPtr CreateFile(
            
string lpFileName,
            EFileAccess dwDesiredAccess,
            EFileShare dwShareMode,
            IntPtr lpSecurityAttributes,
            ECreationDisposition dwCreationDisposition,
            EFileAttributes dwFlagsAndAttributes,
            IntPtr hTemplateFile);

        [DllImport(
"kernel32.dll")]
        
public static extern bool ReadFile(IntPtr hFile, byte[] lpBuffer,
            
uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, IntPtr lpOverlapped);

        [DllImport(
"kernel32.dll")]
        
static extern bool WriteFile(IntPtr hFile, byte [] lpBuffer,
            
uint nNumberOfBytesToWrite, out uint lpNumberOfBytesWritten,
            [In] 
ref System.Threading.NativeOverlapped lpOverlapped);

        [Flags]
            
public enum EFileAccess : uint
        
{
            GenericRead 
= 0x80000000,
            GenericWrite 
= 0x40000000,
            GenericExecute 
= 0x20000000,
            GenericAll 
= 0x10000000
        }


        [Flags]
            
public enum EFileShare : uint
        
{
            None 
= 0x00000000,
            Read 
= 0x00000001,
            Write 
= 0x00000002,
            Delete 
= 0x00000004
        }


        
public enum ECreationDisposition : uint
        
{
            New 
= 1,
            CreateAlways 
= 2,
            OpenExisting 
= 3,
            OpenAlways 
= 4,
            TruncateExisting 
= 5
        }


        [Flags]
            
public enum EFileAttributes : uint
        
{
            Readonly         
= 0x00000001,
            Hidden           
= 0x00000002,
            System           
= 0x00000004,
            Directory        
= 0x00000010,
            Archive          
= 0x00000020,
            Device           
= 0x00000040,
            Normal           
= 0x00000080,
            Temporary        
= 0x00000100,
            SparseFile       
= 0x00000200,
            ReparsePoint     
= 0x00000400,
            Compressed       
= 0x00000800,
            Offline          
= 0x00001000,
            NotContentIndexed
= 0x00002000,
            Encrypted        
= 0x00004000,
            Write_Through    
= 0x80000000,
            Overlapped       
= 0x40000000,
            NoBuffering      
= 0x20000000,
            RandomAccess     
= 0x10000000,
            SequentialScan   
= 0x08000000,
            DeleteOnClose    
= 0x04000000,
            BackupSemantics  
= 0x02000000,
            PosixSemantics   
= 0x01000000,
            OpenReparsePoint 
= 0x00200000,
            OpenNoRecall     
= 0x00100000,
            FirstPipeInstance
= 0x00080000
        }

    }

}

服务器设计界面

服务器端代码
private  IntPtr mailslot;
        
private  Thread t_ReadingProc  =   null ;
        
private   void  button1_Click_1( object  sender, System.EventArgs e)
        
{
            
this.mailslot = Win32.CreateMailslot("//./Mailslot/Myslot",0,Win32.MAILSLOT_WAIT_FOREVER,new IntPtr(0));
            
if(this.mailslot == Win32.INVALID_HANDLE_VALUE)
            
{
                
this.textBox1.Text = "创建邮槽失败";
            }

            
else
            
{
                
this.textBox1.Text += System.DateTime.Now.ToLongTimeString()+"成功创建邮槽//./Mailslot/Myslot ";
                t_ReadingProc
= new Thread(new ThreadStart(Reading));
                t_ReadingProc.Start();
                
this.textBox1.Text += System.DateTime.Now.ToLongTimeString()+"启动读邮槽线程 ";
            }

            
        }


        
private   void  Reading()
        
{
            
byte[] buffer = new byte[256];
            
uint bn = 0;
            
while(Win32.ReadFile(this.mailslot,buffer,256,out bn,new IntPtr(0)))
            
{
                
this.textBox1.Text += System.DateTime.Now.ToLongTimeString()+"邮槽接收到如下数据:"+System.Text.Encoding.GetEncoding("gb2312").GetString(buffer,0,Convert.ToInt32(bn))+" ";
            }

        }

客户端设计界面

.NET进程通信机制——邮槽_第1张图片
客户端代码
         private  IntPtr mailslot;
        
private   void  button2_Click( object  sender, System.EventArgs e)
        
{
            
this.mailslot = Win32.CreateFile(
                
"//./Mailslot/Myslot",
                Win32.EFileAccess.GenericWrite,
                Win32.EFileShare.Read,
                
new IntPtr(0),
                Win32.ECreationDisposition.OpenExisting,
                Win32.EFileAttributes.Normal,
                
new IntPtr(0));
            
if(this.mailslot==Win32.INVALID_HANDLE_VALUE)
            
{
                MessageBox.Show(
"连接邮槽失败");
            }

            
else
            
{
                
this.button2.Text = "已连接";
                
this.button2.Enabled = false;
                
this.button1.Enabled = true;
            }

        }

        
private   void  button1_Click( object  sender, System.EventArgs e)
        
{
            
                
byte[] b = System.Text.Encoding.GetEncoding("gb2312").GetBytes(this.textBox1.Text);
                
uint bl;
                
                System.Threading.NativeOverlapped lp 
= new System.Threading.NativeOverlapped();
                
                
if(Win32.WriteFile(
                    
this.mailslot,b,Convert.ToUInt16(b.Length),out bl,ref lp))
                
{
                    
//MessageBox.Show("发送成功");
                }

                
else
                
{
                    MessageBox.Show(
"发送失败");
                }


        }

测试结果截图

.NET进程通信机制——邮槽_第2张图片

你可能感兴趣的:(.net,object,System,buffer,byte,button)