C#的命名管道(named pipe)

本文介绍了C#中的命名管道实现进程间通信,这种通信方式具有跨权限、跨语言、跨平台的特点。命名管道作为一种FIFO对象,允许拥有特定授权的程序通过知道管道名称来读取信息。文章提供了C#接收消息和VBScript发送消息的简单示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

命名管道是一种从一个进程到另一个进程用内核对象来进行信息传输。和一般的管道不同,命名管道可以被不同进程以不同的方式方法调用(可以跨权限、跨语言、跨平台)。只要程序知道命名管道的名字,发送到命名管道里的信息可以被一切拥有指定授权的程序读取,但对不具有制定授权的。命名管道是一种FIFO(先进先出,First-In First-Out)对象。

我们可以使用命名管道在2个不同的进程中进行通信而不需要通过一般的IO读写文件来获取信息。

在C#中可以简单的这么用用来接收消息

using System.IO.Pipes;

private volatile NamedPipeServerStream _OutputNamedPipe;
_OutputNamedPipe = new NamedPipeServerStream(pipeName, PipeDirection.InOut, 254);
private void BeginReceiveOutput() { try { _OutputNamedPipe.WaitForConnection(); using (var reader = new StreamReader(_OutputNamedPipe)) { _OutputMessage = reader.ReadLine(); } } catch { } }

在vbscript里可以这样来发消息

Dim fs, pipe
Set fs = CreateObject("Scripting.FileSystemObject")
Set pipe = fs.OpenTextFile("\\.\pipe\PipeName", 8, False, 0)
pipe.WriteLine("This is a message from vbs")
pipe.Close

更为严谨的写法

  1     class Server
  2     {
  3         static void Main(string[] args)
  4         {
  5             var running = true;
  6 
  7             while (running) // loop only for 1 client
  8             {
  9                 using (var server = new NamedPipeServerStream("PIPE_NAME", PipeDirection.InOut))
 10                 {
 11                     server.WaitForConnection();
 12 
 13                     Console.WriteLine("Client connected");
 14 
 15                     using (var pipe = new PipeStream(server))
 16                     {
 17                         pipe.Send("handshake");
 18 
 19                         Console.WriteLine(pipe.Receive());
 20 
 21                         server.WaitForPipeDrain();
 22                         server.Flush();
 23                     }
 24                 }
 25             }
 26 
 27             Console.WriteLine("server closed");
 28             Console.Read();
 29         }
 30     }
 31 
 32     class Client
 33     {
 34         static void Main(string[] args)
 35         {
 36             using (var client = new NamedPipeClientStream(".", "PIPE_NAME", PipeDirection.InOut))
 37             {
 38                 client.Connect(2000);
 39 
 40                 using (var pipe = new PipeStream(client))
 41                 {
 42                     Console.WriteLine("Message: " + pipe.Receive());
 43 
 44                     pipe.Send("Hello!!!");
 45                 }
 46             }
 47 
 48             Console.Read();
 49         }
 50     }
 51 
 52     public class PipeStream : IDisposable
 53     {
 54         private readonly Stream _stream;
 55         private readonly Reader _reader;
 56         private readonly Writer _writer;
 57 
 58         public PipeStream(Stream stream)
 59         {
 60             _stream = stream;
 61 
 62             _reader = new Reader(_stream);
 63             _writer = new Writer(_stream);
 64         }
 65 
 66         public string Receive()
 67         {
 68             return _reader.ReadLine();
 69         }
 70 
 71         public void Send(string message)
 72         {
 73             _writer.WriteLine(message);
 74             _writer.Flush();
 75         }
 76 
 77         public void Dispose()
 78         {
 79             _reader.Dispose();
 80             _writer.Dispose();
 81 
 82             _stream.Dispose();
 83         }
 84 
 85         private class Reader : StreamReader
 86         {
 87             public Reader(Stream stream)
 88                 : base(stream)
 89             {
 90 
 91             }
 92 
 93             protected override void Dispose(bool disposing)
 94             {
 95                 base.Dispose(false);
 96             }
 97         }
 98 
 99         private class Writer : StreamWriter
100         {
101             public Writer(Stream stream)
102                 : base(stream)
103             {
104 
105             }
106 
107             protected override void Dispose(bool disposing)
108             {
109                 base.Dispose(false);
110             }
111         }
112     }

 

转载于:https://www.cnblogs.com/leakeyash/p/5633696.html

### 回答1: SQL Server中的默认约束是一种约束,它定义了在插入新行时,如果没有为该列提供值,则将使用默认值。默认约束可以在创建表时定义,也可以在后期添加到表中。默认约束可以是常量、表达式或函数。如果没有为列定义默认约束,则该列将接受NULL值。 ### 回答2: SQL Server中的默认约束Default Constraint)是一种用于指定默认值的对象,该对象将在插入数据时自动添加到表中。默认约束可用于任何表中的任何列,以确保在没有明确提供值的情况下为列提供默认值,也可以用于用户界面或代码中省略某些列值的情况。 默认约束可以在创建表时使用CREATE TABLE命令来定义,也可以通过使用ALTER TABLE命令在现有表中添加。以下是一些默认约束的示例: 示例1:在创建表时添加默认约束 CREATE TABLE myTable ( myColumn INT DEFAULT 0 ) 示例2:在现有表中添加默认约束 ALTER TABLE myTable ADD CONSTRAINT myDefaultConstraint DEFAULT 0 FOR myColumn 示例3:删除现有默认约束 ALTER TABLE myTable DROP CONSTRAINT myDefaultConstraint 默认约束可以在添加或更新行时显式地提供覆盖值。例如,在上面的第一个示例中,如果想将我的列的值设置为5而不是0,则可以在插入数据时提供一个值,并将其覆盖默认值,如下所示: INSERT INTO myTable(myColumn) VALUES (5) 总之,SQL Server的默认约束是一个非常有用的功能,可确保在没有提供值的情况下,任何表中的列都有默认值。通过使用默认约束,可以减少手动输入和代码编写的工作量,并确保数据表的一致性和完整性。 ### 回答3: SQL Server的DEFAULT约束是一个用于定义默认值的约束。它可以应用于表中的列,用于在没有提供任何值的情况下为列提供默认值。DEFAULT约束可以包含任何常数或标量表达式,该表达式返回所需的默认值。 在创建表时,可以通过以下命令来定义DEFAULT约束: CREATE TABLE 表名( 列名 数据类型 DEFAULT 默认值 ); 例如,可以使用以下命令在表中创建一个DEFAULT约束: CREATE TABLE Employee ( EmployeeID INT, FirstName VARCHAR(50), LastName VARCHAR(50), HireDate DATE DEFAULT GETDATE() ); 在这个例子中,HireDate列使用DEFAULT约束来提供默认值。如果在插入记录时不为HireDate列提供任何值,它将自动设置为当前日期。 同样,DEFAULT约束可以使用ALTER TABLE命令在表中进行修改和删除。例如,以下命令可以修改表Employee中HireDate列的DEFAULT约束: ALTER TABLE Employee ALTER COLUMN HireDate SET DEFAULT '2021-01-01'; 通过这种方式,DEFAULT约束将被更改为提供2021年1月1日作为默认值。 值得注意的是,如果列上已经有约束,那么DEFAULT约束将与这个约束一起工作。这意味着如果在列上定义了NOT NULL约束,则必须为该列提供值,DEFAULT约束不能用于提供默认值。 在SQL Server中,DEFAULT约束是非常有用和常见的约束之一,它可以简化编程工作并提高数据的一致性和完整性。因此,在设计基于SQL Server的数据库时,DEFAULT约束应该得到充分的考虑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值