我有一个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) 我有一个服务器应用程序.我也有一个客户端应用程序.当两个应用程序碰巧在同一网络上时,我能够在应用程序之间建立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的所有服务器?
我需要通过TCP连接将机密数据发送到服务器.我做了很多研究,理解了理论部分.根据我研究的内容,我想做以下事情:
注意有一个服务器和一个客户端:(我们假设任何人都可以获得客户端或服务器的公钥)
客户端创建他的公钥和私钥.他能够用他的私钥加密并用他的公钥解密.
服务器创建他的公钥和私钥.私钥用于解密消息,公钥用于加密消息.(注意与客户端相反)
客户端获取服务器的公钥.然后,客户端将能够使用该密钥加密消息,并且唯一能够解密该消息的消息将是服务器的私钥.
由于服务器需要确定消息来自该特定客户端,因此客户端将使用其私钥加密其名称(签名).
因此客户端消息将包含:要发送的数据,客户端的公钥,使用客户端私钥加密的客户端名称.
客户端将使用服务器中的公钥加密消息.然后,客户端将该消息发送到服务器.
服务器将使用他的私钥解密刚刚收到的消息.
一旦消息被解密,它将包含来自客户端的数据(信息),加密签名,公钥.
最后,服务器将使用消息中包含的公钥解密客户端签名,以验证消息是否来自该客户端.
好的,这就是非对称加密的工作原理.我还研究过使用.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) 我想实现一个方法,使我能够在树中找到一个节点.我这样做的方式是递归使用全局变量来知道何时停止.
我上课了:
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程序文件中获取全局符号.我使用的是linux命令,readelf -s filePath 当我使用该命令时,这就是我得到的:

我绘制一个蓝色矩形表示变量名称无法正确显示.他们在25个字符后修剪.如何让它显示全名?
将TrueCrypt容器安装到驱动器盘符后,是否可以在批处理文件中确定从哪个容器安装驱动器号,或者将容器安装到哪个驱动器盘符?
在批处理文件中,我想将指定的TrueCrypt容器挂载到指定的驱动器号.如果容器已经安装或驱动器号不可用,则TrueCrypt错误,因此我只想在指定的容器尚未安装到指定的驱动器号时才运行TrueCrypt,也就是说,仅当操作没有时才运行TrueCrypt已经完成了.
任何建议,将不胜感激.
赏金摘要简而言之,想象一下你有卷C:\Vol1.tc并C:\Vol2.tc安装到驱动器X和Y.你如何通过批处理文件或C#代码C:\Vol1.tc安装到驱动器X和C:\Vol2.tc驱动Y程序?
我有一个非常基本的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) 可能重复:
如何中止/取消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) 我怎么能onCompleteCallBack在SomeAsyncMethod被调用的同一个线程上调用该方法?
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# ×8
abort ×1
asp.net ×1
batch-file ×1
cancellation ×1
cryptography ×1
dwarf ×1
elf ×1
encryption ×1
linq ×1
linux ×1
networking ×1
readelf ×1
tcp ×1
tree ×1
truecrypt ×1
webrequest ×1
windows ×1
wpf ×1