我有一个winform程序,是要一直运行的,他的功能是从GDS那里不停地获取最新数据,然后将最新的数据缓存到内存中,我现在要写一个程序去监听这个winform程序是否是在运行,如果程序停止了运行我就采用相应的方法通知管理员,但是我没有写过这种监听程序,我们头告诉我可以采用socket或者是采用监听进程的方法,哪位大大能提供点这方面的经验啊?当然了,我自己也在不停的百度,google,所以建议我百度,google的就别说了
解决方案 »
- vs2010 css样式设计的问题
- 关于RenderControl输出用户控件后,页面无法加载子控件事件
- 请问有人在项目中用spring.net吗?
- 帮忙写一条SQL语句
- 老话题:求助CSDN上的高手指教,实现静态分页!!不要求像alibaba那么强,也要和QQ的差不多。
- 页面出现问号...
- 请问各位高手,Asp.NET能否实现ActiveX组件
- sqlcommand的读取执行结果的问题
- ajaxpro 如何读取request对象中的值
- 菜鸟大胆质疑书上关于Response.AppendHeader 的讲解(图)
- 点击超链接Iframe不显示
- 类型“LinkButton”的控件“ctl00_ContentPlaceHolder1_FirstPage”必须放在具有 runat=server 的窗体标记内
private void InitServer()
{
//启动程序
IPAddress[] addrIP = Dns.GetHostAddresses(Dns.GetHostName());
IPAddress ip = addrIP[0];
//int myprot = 36829;
int myprot = 9000;
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); serverSocket.Bind(new IPEndPoint(ip, myprot));
serverSocket.Listen(1000);
} private void button1_Click(object sender, EventArgs e)
{
//开始监听
while (true)
{
allDone.Reset();
serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), serverSocket);
allDone.WaitOne();
}
} public void AcceptCallback(IAsyncResult ar)
{
//等待接受
allDone.Set();
Socket listener = (Socket)ar.AsyncState;
Socket handler = listener.EndAccept(ar); uint dummy = 0;//判断客户端失去连接
byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3];
BitConverter.GetBytes((uint)1).CopyTo(inOptionValues, 0);
BitConverter.GetBytes((uint)5000).CopyTo(inOptionValues, Marshal.SizeOf(dummy));
BitConverter.GetBytes((uint)5000).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2);
handler.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null);
StateObject state = new StateObject();
state.workSocket = handler;
state.buffer = new byte[StateObject.BUFFER_SIZE];
state.tmpAl = new ArrayList(2048);
//加入客户端列表
if (!list.Contains(state))
{
list.Add(state);
} handler.BeginReceive(state.buffer, 0, StateObject.BUFFER_SIZE, 0, out errorCode, new AsyncCallback(ReadCallback), state);
} //异步回调
public void ReadCallback(IAsyncResult ar)
{
string content = string.Empty;
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;
int bytesRead = 0;
try
{
bytesRead = handler.EndReceive(ar, out errorCode);
if (errorCode == SocketError.Success)
{
if (bytesRead > 0)
{
byte[] tmpbytes = new byte[bytesRead];
Array.Copy(state.buffer, 0, tmpbytes, 0, bytesRead);
state.tmpAl.AddRange(tmpbytes);
//如果此处接收的数据包长度大于BUFFER_SIZE,那么就会出现数据包不齐,下一个数据包就会粘连!
//如果数据超过BUFFER_SIZE的大小则循环取 if (handler.Available > 0)
{
state.buffer = new byte[handler.Available];
handler.BeginReceive(state.buffer, 0, handler.Available, 0, out errorCode, new AsyncCallback(ReadCallback), state);
}
else
{
byte[] endreceive = new byte[state.tmpAl.Count];
state.tmpAl.CopyTo(endreceive);
state.tmpAl.Clear();
content = Encoding.UTF8.GetString(endreceive);
Array.Clear(endreceive, 0, endreceive.Length); //省略处理数据
// data =
//发送给客户端 if (!string.IsNullOrEmpty(data))
{
Send(handler, data);
}
}
}
Array.Clear(state.buffer, 0, state.buffer.Length);
handler.BeginReceive(state.buffer, 0, state.buffer.Length, 0, out errorCode, new AsyncCallback(ReadCallback), state);
} else
{
if (errorCode == SocketError.ConnectionReset)
{
if (state != null && !state.workSocket.Connected)
{
if (list.Contains(state))
{
list.Remove(state);
}
}
}
}
}
catch (Exception ex)
{
handler.BeginReceive(state.buffer, 0, state.buffer.Length, 0, out errorCode, new AsyncCallback(ReadCallback), state);
}
} private void Send(Socket handler, string data)
{
byte[] byteData = Encoding.UTF8.GetBytes(data); handler.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), handler);
} private void SendCallback(IAsyncResult ar)
{
Socket handler = (Socket)ar.AsyncState;
int bytesSent = handler.EndSend(ar, out errorCode);
if (errorCode != SocketError.Success)
{
}
} private void button2_Click(object sender, EventArgs e)
{
strMeaOK = textBoxMeaOK.Text;
strMeaFinish = textBoxMeaFinish.Text;
strMeaStop = txtMeaStop.Text;
strPrtFlag = txtPrtFlag.Text;
strMeaAbandon = txtMeaAbandon.Text;
}
public void Getprocess(string name)
{
Process[] p = Process.GetProcessesByName(name);
if(p.Length<=0)
{
Process.Start("KillProcess");
}
}