好吧基本上
/// <summary>
/// Sends the process.
/// </summary>
/// <param name="MD5">The M d5.</param>
/// <param name="procName">Name of the proc.</param>
/// <param name="procLoc">The proc loc.</param>
public void SendProcess(string MD5, string procName, string procLoc)
{
// Create a request using a URL that can receive a post.
WebRequest request = WebRequest.Create("http://localhost/EDAC//SubmitProc.php ");
// Set the Method property of the request to POST.
request.Method = "POST";
// Create POST data and convert it to a byte array.
string postData = "MD5=" + MD5 + "&procName=" + procName + "&procLoc=" + procLoc + "&userID=" + _userID;
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
// Set the ContentType property of the WebRequest.
request.ContentType = "application/x-www-form-urlencoded";
// Set the ContentLength property of the WebRequest.
request.ContentLength = byteArray.Length;
// Get the request stream.
Stream dataStream = request.GetRequestStream();
// Write the data to the request stream.
dataStream.Write(byteArray, 0, byteArray.Length);
// Close the Stream object.
dataStream.Close();
}
此函数在循环中调用
Process[] currentProcess = Process.GetProcesses();
foreach (var process in currentProcess)
{
var isContained = false;
foreach (var heldProcess in _processlist)
{
if (heldProcess.Id == process.Id)
{
isContained = true;
}
}
if (!(isContained))
{
try
{
_processLocs.Add(process.MainModule.FileName);
_processlist.Add(process);
_tw.WriteLine(process.ProcessName);
_tw.WriteLine(process.MainModule.FileName);
var md5 = GetMD5HashFromFile(process.MainModule.FileName);
_tw.WriteLine(md5);
SendProcess(md5, process.ProcessName, process.MainModule.FileName);
}
catch (Win32Exception ex)
{
}
}
}
基本上这个方法在我的本地主机上就好了,而不是在web服务器上,现在这个方法显然不是空闲的,考虑到程序首次加载时你得到大约30个连接请求和半秒内发送的消息,它基本上会锁定,可能由于没有连接。
那么这样做的正确方法是什么?我一直在寻找一种方法来获得循环,等待服务器准备好接收更多数据,或者它是否可能发送所有对象并将其处理为插入php端的变量
答案 0 :(得分:0)
好吧基本上
public void SendProcess(string md5, string procName, string procLoc)
{
var values = new NameValueCollection
{
{ "MD5", md5 },
{ "procName", procName },
{ "procLoc", procLoc },
{ "userID", _userID },
};
using (var client = new WebClient())
{
client.UploadValues("http://localhost/EDAC/SubmitProc.php", values);
}
}
你可以循环调用这个函数,它应该可以工作。
请注意所使用的资源(此处:WebClient)是处置,因此后续调用可以重复使用相同的HTTP连接(连接池)。否则,您很快就会遇到许多无法重复使用的打开连接。
现在,反复发出大量小型HTTP请求的效率远远低于发出一些较大的请求。您应将多个请求合并为一个请求,并将每个时间单位的请求数限制为合理的级别。您可以使用WebClient.UploadString或WebClient.UploadData上传比简单键/值对更复杂的数据。
那就是说,我永远不想在我的机器上安装一个软件,将活动进程列表发送到某个服务器。我希望你的应用程序中有一个很大的警告警告用户你的隐私侵犯。