小编Ton*_*Nam的帖子

从不同的线程访问对象

我有一个Server类,它基本上等待来自客户端的连接.在该类中,我创建了一个NetworkStream对象,以便能够从客户端接收字节.因为NetworkStream.Read()方法不是异步的(意味着它会等到它从客户端读取字节以继续执行类似于messagebox方法的代码),所以我必须在一个单独的线程中读取字节,以便如果程序恰好等待读取数据,则使用该程序的用户仍然可以与程序交互.

无论如何,该线程拥有许多对象.一个例子是我在该类中有一个名为log的List.我使用该列表来了解服务器的状态.也许它正在监听连接,或者它的状态是"连接"或"断开连接".

所以如果我这样做:

Server myServer = new Server("192.168.0.120","1300"...\\ I pass the appropite parameters in order to instantiate it

//...
.. then I am able to latter look at the log as
string foo = myServer.Log[0] for example.
Run Code Online (Sandbox Code Playgroud)

因为我想知道日志何时更新,在服务器类上我创建了一个事件:

    public delegate void onUpdateHandler(string newStatus);
    public event onUpdateHandler onUpdate = delegate { };
Run Code Online (Sandbox Code Playgroud)

然后,我在Server类上触发事件:

 onUpdate("waitingForConnection");
Run Code Online (Sandbox Code Playgroud)

我用这个方法收到这些事件:

在此输入图像描述

但如果我尝试用newStatus做一些事情,我会收到错误说明:

System.InvalidOperationException: The calling thread cannot access this object because a different thread owns it.
Run Code Online (Sandbox Code Playgroud)

那我怎么能用事件传递一个对象呢?


编辑

所以我也注意到如果我这样做:

在此输入图像描述

我也收到错误!

但当我做同样的事情时,从按钮调用:

   // SERVER IS RUNNING BEFORE CALLING …
Run Code Online (Sandbox Code Playgroud)

c# wpf multithreading

7
推荐指数
1
解决办法
1万
查看次数

查找侦听本地网络上特定端口的服务器

我有一个服务器应用程序.我也有一个客户端应用程序.当两个应用程序碰巧在同一网络上时,我能够在应用程序之间建立tcp连接.因此,假设运行服务器应用程序的计算机正在侦听端口2121上的新连接,并且它具有LAN IP地址192.168.0.120.在运行客户端应用程序的另一台计算机上,我将能够通过提供端口号2121和IP地址192.168.0.120来建立连接.

有没有办法找到网络上正在侦听端口2121的所有计算机?

我现在想的一个算法是:

  • 获取当前计算机的IP地址,并说它出现为192.168.0.145.

  • 现在很可能服务器将侦听IP地址192.168.0.

  • 然后在端口2121上ping 192.168.0.1,在端口2121上ping 192.168.0.2 ...然后继续.

我不知道这种方法是否有效.此外,服务器可能正在侦听IP地址192.168.1.x

那么我必须对我的服务器和客户端应用程序进行哪些更改,以便客户端能够找到侦听端口2121的所有服务器?

c# networking tcp

7
推荐指数
2
解决办法
2万
查看次数

C#中的非对称加密示例

我需要通过TCP连接将机密数据发送到服务器.我做了很多研究,理解了理论部分.根据我研究的内容,我想做以下事情:

注意有一个服务器和一个客户端:(我们假设任何人都可以获得客户端或服务器的公钥)

  1. 客户端创建他的公钥和私钥.他能够用他的私钥加密并用他的公钥解密.

  2. 服务器创建他的公钥和私钥.私钥用于解密消息,公钥用于加密消息.(注意与客户端相反)

  3. 客户端获取服务器的公钥.然后,客户端将能够使用该密钥加密消息,并且唯一能够解密该消息的消息将是服务器的私钥.

  4. 由于服务器需要确定消息来自该特定客户端,因此客户端将使用其私钥加密其名称(签名).

  5. 因此客户端消息将包含:要发送的数据,客户端的公钥,使用客户端私钥加密的客户端名称.

  6. 客户端将使用服务器中的公钥加密消息.然后,客户端将该消息发送到服务器.

  7. 服务器将使用他的私钥解密刚刚收到的消息.

  8. 一旦消息被解密,它将包含来自客户端的数据(信息),加密签名,公钥.

  9. 最后,服务器将使用消息中包含的公钥解密客户端签名,以验证消息是否来自该客户端.


好的,这就是非对称加密的工作原理.我还研究过使用.NET框架创建这些密钥对的类.我研究过的可以创建此公钥和私钥对的类是:

System.Security.Cryptography.DES
System.Security.Cryptography.DSACryptoServiceProvider 
System.Security.Cryptography.ECDsa 
System.Security.Cryptography.ECDsaCng 
System.Security.Cryptography.ECDiffieHellman 
System.Security.Cryptography.ECDiffieHellmanCng 
System.Security.Cryptography.RSA 
System.Security.Cryptography.RSACryptoServiceProvider 
Run Code Online (Sandbox Code Playgroud)

所以现在我的问题出现在如何使用这个类中的一个用C#来完成它?我理解理论部分是如何工作的,但我怎么做我刚才用代码描述的东西.我研究了一些例子,但我很难理解它们.

这是我发现我相信我所描述的一个例子:

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace Example
{
    class Program
    {
        static CngKey aliceKey;
        static CngKey bobKey;
        static byte[] alicePubKeyBlob;
        static byte[] bobPubKeyBlob;

        static void Main()
        {
            CreateKeys();
            byte[] encrytpedData = AliceSendsData("secret message");
            BobReceivesData(encrytpedData);

            Console.Read();

        }

        private static void CreateKeys()
        {
            aliceKey = CngKey.Create(CngAlgorithm.ECDiffieHellmanP256);
            bobKey = CngKey.Create(CngAlgorithm.ECDiffieHellmanP256);
            alicePubKeyBlob = aliceKey.Export(CngKeyBlobFormat.EccPublicBlob);
            bobPubKeyBlob = bobKey.Export(CngKeyBlobFormat.EccPublicBlob);
        }

        private …
Run Code Online (Sandbox Code Playgroud)

c# encryption cryptography

7
推荐指数
2
解决办法
1万
查看次数

遍历树时查找节点

我想实现一个方法,使我能够在树中找到一个节点.我这样做的方式是递归使用全局变量来知道何时停止.

我上课了:

class Node    // represents a node in the tree
{ 
     // constructor
     public Node() {
          Children = new List<Node>();
     }

     public List<Node> Children; 
     public string Name;
     public string Content;            
}
Run Code Online (Sandbox Code Playgroud)

我现在的方法是:

    private bool IsNodeFound = false; // global variable that I use to decide when to stop

    // method to find a particular node in the tree
    private void Find(Node node, string stringToFind, Action<Node> foundNode)
    {
        if(IsNodeFound)
           return;

        if (node.Content.Contains(stringToFind)){
            foundNode(node); 
            IsNodeFound =true;               
        }

        foreach (var child in …
Run Code Online (Sandbox Code Playgroud)

c# linq tree data-structures

7
推荐指数
2
解决办法
2万
查看次数

readelf -s不输出完整的变量名

我需要从编译的c程序文件中获取全局符号.我使用的是linux命令,readelf -s filePath 当我使用该命令时,这就是我得到的:

在此输入图像描述

我绘制一个蓝色矩形表示变量名称无法正确显示.他们在25个字符后修剪.如何让它显示全名?

linux elf dwarf readelf

7
推荐指数
1
解决办法
5454
查看次数

确定已安装的TrueCrypt卷的驱动器号

将TrueCrypt容器安装到驱动器盘符后,是否可以在批处理文件中确定从哪个容器安装驱动器号,或者将容器安装到哪个驱动器盘符?

在批处理文件中,我想将指定的TrueCrypt容器挂载到指定的驱动器号.如果容器已经安装或驱动器号不可用,则TrueCrypt错误,因此我只想在指定的容器尚未安装到指定的驱动器号时才运行TrueCrypt,也就是说,仅当操作没有时才运行TrueCrypt已经完成了.

任何建议,将不胜感激.

编辑

赏金摘要简而言之,想象一下你有卷C:\Vol1.tcC:\Vol2.tc安装到驱动器XY.你如何通过批处理文件或C#代码C:\Vol1.tc安装到驱动器XC:\Vol2.tc驱动Y程序?

c# batch-file truecrypt

7
推荐指数
2
解决办法
2359
查看次数

检查是否已安装Windows映像组件(wic注册表)

如何检查64位XP机器上是否安装了Windows映像组件.

windows

6
推荐指数
2
解决办法
1万
查看次数

从Web服务实例化对象与从常规类实例化对象

我有一个非常基本的Web服务:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

namespace WebService1
{        
    /// <summary>
    /// Summary description for Service1
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class Service1 : System.Web.Services.WebService
    {

        public int myInt = 0;

        [WebMethod]
        public int increaseCounter()
        {
            myInt++;
            return myInt;
        }

        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }

    } …
Run Code Online (Sandbox Code Playgroud)

c# asp.net webrequest

6
推荐指数
1
解决办法
7016
查看次数

取消执行方法的正确方法

可能重复:
如何中止/取消TPL任务?

我有一个方法需要一些时间来执行因此我返回结果作为回调.我的方法看起来像:

public static void DoWork( Action<object> onCompleteCallBack)
{
  Task.Factory.StartNew( () => {
    // Do work
    onCompleteCallBack(someResult);
  });
}
Run Code Online (Sandbox Code Playgroud)

现在我希望能够在用户不想等待的情况下停止执行该方法.结果这就是我的成果:

static void Main ( string[] args )
{            
  var cancelMethod = DoWork( x =>
  {                
    // method completed
    Console.Write( x.ToString() );
  });
  Thread.Sleep( 5000 ); // some time passes 

  // then user decides to abort method
  cancelMethod();
  Console.Read();
}

static Action DoWork ( Action<object> onCompleteCallBack )
{
  bool stopExecuting = false;
  Task.Factory.StartNew( () =>
  {
    for ( var i …
Run Code Online (Sandbox Code Playgroud)

c# abort task-parallel-library cancellation

6
推荐指数
1
解决办法
979
查看次数

从特定线程调用方法

我怎么能onCompleteCallBackSomeAsyncMethod被调用的同一个线程上调用该方法?

public void SomeAsycMethod ( Action<object> onCompleteCallBack )
{
    // get the current thread 
    /* var ThisThread = Thread.CurrentThread. */

    Task.Factory.StartNew( () =>
    {
        Thread.Sleep( 1000 );// do some work;

        // lastly call the onCompleteCallBack on 'ThisThread'
        onCompleteCallBack( "some result" );

        // I am looking for something like:
        /* ThisThread.Invoke("some result"); */
    });
}
Run Code Online (Sandbox Code Playgroud)

c# multithreading task-parallel-library

6
推荐指数
1
解决办法
2721
查看次数