send a server a life signal from remote client - c#

I have about 300 remote computers that send data to my server. i have a windows service that i made with a console aplication which reads data from energy meters and sends alarms via email. I need to know if one of them is offline for more than one day.
the remote clients doesnt have a fixed IP address so i assume that the client would have to make the contact.
i toghut about using signalIR to send a simple messeage to the server and let it know that the client is online, but i have no idea how to do it. i also raed about helth checks but i am not sure that's what i need.
what will be the easiest way to send a short message from a client to a server?
Thank you, Shay.

Related

Grpc - send message from one client to another client that is connected to the same server

Is it possible to send message from one client to another client that is connected to the same server?
I want send data from one client to server Then send to specific client. I think I need to get client ID but I dont know how to get this id and how to send this message to that client from server.
I have a sample here. This is a chat server-client application. Multiple clients can connect to the server. When a client writes a message, the server simply broadcasts it for all clients who are receiving server stream RPC.
https://github.com/cactuaroid/GrpcWpfSample
See these server side implementation. When a client calls Subscribe(), it awaits m_chatService.Added event. When a client calls Write(), it raises the event and event args ChatLog is written on responseStream.
https://github.com/cactuaroid/GrpcWpfSample/blob/f6e8c4b2493c23cdcbaffeca29b5bb6705fbe95c/GrpcWpfSample.Server/Grpc/ChatServiceGrpcServer.cs
https://github.com/cactuaroid/GrpcWpfSample/blob/f6e8c4b2493c23cdcbaffeca29b5bb6705fbe95c/GrpcWpfSample.Server/Model/ChatService.cs
You can add your logic such as specifying channel name to subscribe/write, or define OpenChannel(string password) to be called by client at the first time so that server can bind the client IP address to the channel, whatever as you like.
There's no special gRPC feature that would allow you to do this (all RPC are between a server and a client, there's no "broadcast" or "selective broadcast" feature to reach out to other clients connected to the same server.
The logic you want is something that can definitely be implemented and but details of such solution depend on your need. A naive approach that might work is e.g. this:
each client opens a bidi-streaming call to the server
server keeps a directory of connected clients
once server receives a message from a client, it selects which client it should forward to based on the directory.
server forwards the message to a client.
Needless to say this setup feels a bit complicated (you're basically implementing your own network protocol on top of gRPC), so even though it might be just the right thing for you to do, it would make sense to think about how to simplify the protocol so that you can use features directly supported by gRPC.

Redirect all program packets through alerternate port

I have an application I need to debug.
The application connects to a server using a specific UDP port, though the application can be configured to join any server with any UDP port.
My goal is to be able to view all incoming data/packets from the server, and be able to accurately send my own packets from my application to the application I want to debug to see and learn from the effects.
My idea was to use some sort of web service to redirect all traffic, sent and received through. With this in mind, I could process the data being received from the server and choose when I want to send my own packets between data being received from the official server.
I am fluent in VB.NET and C#, if anyone has any tips or ideas to help kick-start this project! Thank you to all who helpout! :)
Search for packet injection if you're interested in this. You can forward all your data through your own proxy/vpn and study the data there.

How can server application check if a client application is online?

I have a server application which monitors the clients' activities in the network (all codes are in C# winforms). The server application already has IP addresses of client computers. I want to know how to check
i) if the clients are online (i.e, have opened and been using the client applications) or offline (not using the applications)?
ii) if the clients' computers are opened?
I'm not good in networking and have not got it after searching for hours on internet. Please help!
Edited: I have seen the mentions of HTTP, TCP, UDP, etc. in various sites about server-client applications. What are the differences between them and which one should be used for the above?
PS: Sorry for extra questions. The questions are related so I dont want to make a new post.
You could check if the client machines are online by pinging each machines using their respective IP address.
Ping ping = new Ping();
PingReply pingReply = ping.Send("IP Address");
if(pingReply.Status == IPStatus.Success)
{
//Machine is online
}
To check if client machines are using any particular application(if
those application are built by you and have access to source code).
you can use WCF inter process communication. basically you will create
a WCF service method and host in a managed environment. to be specific
you could host this service in your server win form application. As
long as your win form application is running in the server client
application installed in individual machines can call this method to
send a status(including individual IP address of machines). so server
app would know who is running/opened the specific client application
in each machine.
If you want to check the status of any other client applications, say
you want to get the status to server whenever a client machine runs a
"xyz" application. then you need a create a application which runs on
individual client machines(Windows service would be best option). job
of this application would be to check the running processes
periodically to see if any specific application process is running. if
then it will invoke the WCF hosted in your server app to send the
status.
Several options are available, following is a conceptual answer
Your server can maintain available clients in some list. Here you can include Time to live for a specific client (Like session expiring). You client need to send periodical flags to server to indicate that Client is still using the service and when Server get this reply it can update it list's session so it won't be expire.
Note - The list can be a small data structure which include clients IP and Last flag recieved time. Your server then can go through this list and check for expiration of a client (lets say when time stamp is older than 2 minutes Server assumes client doesn't use the service/not online)
Also other option is your server can send client a flag and get reply back periodically.
Simple Client Server -
http://www.codeproject.com/Articles/12286/Simple-Client-server-Interactions-using-C [Simple guide]
http://csharp.net-informations.com/communications/csharp-multi-threaded-server-socket.htm [Multi threaded]

Sending messages from server to client c#

My client sends messages to the my server using tcp protocol (my server has a listener).
I'm trying to send messages back from the server to the client, but I'm not sure what do I need to add to the client in order to get those messages.
I tried looking it up, but I didn't understand how to implement it.
Could you please assist?
It's the exact same process, but in reverse.
If you intend to receive messages independently (i.e. not in response to a request by the client), you need to make the client a TCP server, too. The client needs to implement exactly the same thing as the server you have now and the server needs to connect to the client.
Can't you use WCF, which supports callback contracts?
If you want a console example of a client server application using a network library see here http://www.networkcomms.net/how-to-create-a-client-server-application-in-minutes/.
If you want a WPF application example then see here http://www.networkcomms.net/creating-a-wpf-chat-client-server-application/

Multi-Client Server communication when server is offline

So I want to create a Multi-Client/Server application. I know multiple clients can connect through one port, and I want to allow for the messages to be stored in a list when the server is "offline".
I'm having trouble finding information online to help me understand how the server can tell the difference between the multiple clients on the port. For example, if a 2 clients send messages to the server while it is offline and I store them in a list, how would I be able to tell the server that this message came from this client first so answer that, and then this message came from this client next?
Is there any information online on an easy way to achieve this? Any help would be greatly appreciated.
Sorry, I didn't make it very clear. I'll try again! Ok basically I want like a middleware between them so that the clients contact the middleware with the message, the middleware checks if the server is online and if so it sends it on, otherwise it will store the message(s) until the server is connected again. Does this make more sense? I'm not great at explaining myself, sorry again!
There seems to be some confusion of concepts here. When client are not connected they obviously can't send anything to the server and also don't have a port. Conversely, when the server is running and clients connect to it, the server has an object for each connection, representing each client.

Categories

Resources