Hi, in a previous article I had shown how to monitor & capture data on a specific port using VB. Mainly to allow my server send out notification to the clients, like a Caller ID Alert. That article can be found here
Below I’ll show the code I use on the server side to actually open and send the information to the clients.
Like mentioned above I will use the example of a caller Id alert , so the program will open a port 81 and send the text ‘callerid’ to the clients (In this case 192.168.0.106). You can use PC names if you have a home router like D-link etc.
Since I have a couple of clients I use VB ‘commandline’ feature to retrieve the IP, port and message that I am going to send. My utility is called ‘BumpClients’. For the example lets say this how its called
“Bumpclients.exe 192.168.0.106 callerid 81”
‘—————— Setting up the imports, make sure you include System.Net and System.net.Sockes, the others may not be needed
Option Strict Off Option Explicit On Imports VB = Microsoft.VisualBasic Imports System.Xml.XPath Imports System.IO Imports System.Net Imports System.Net.Sockets Imports System.Data Imports System Imports System.Drawing Imports System.Windows.Forms Public Class Form1 '------------------------------ Create the instance to of the TCP Client (Its the same as receiving) Public WithEvents OpenPort As TcpClient '------ I use the Form_load event to quickly send the message and exit the program, no user interaction is needed, we grab all paramters from the command line when called. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.WindowState = FormWindowState.Minimized '- Go hidden Me.Hide() '- Go hidden '------ Next using the Split command I grab the three parameters by looking for the space( This will give me the IP,the command,and port the program will use!) '------ Data(0)=IP, Data(1)=command, Data(2)=port. Dim IP As String Dim datA_out Dim port As Integer data_out = Split(Command$(), " ") IP = data_out(0) port = data_out(2) '------ Just a quick check to make I can ping the IP, if not just exit and dont even bother. If My.Computer.Network.Ping(IP) = False Then End '---- The actualy opening of the port un a 'try' statement if it fails exit also Try OpenPort = New TcpClient(IP, port) Catch End End Try '------ If all is good then go ahead and convert our text to bytes and send it out using the stream method! Dim data As [Byte]() = System.Text.Encoding.ASCII.GetBytes(Trim(data_out(1))) Dim stream As NetworkStream = OpenPort.GetStream() stream.Write(data, 0, data.Length) '------ Close and exit!- That's it! stream.Close() OpenPort.Close() End End Sub End Class
A important note, remember that on your client you need to open the port you use in the firewall or it will never see anything, but you dont need to open it on the server since it will be sending. To test this you will need the two actual computers sine you cant monitor and send data thru the same port.
In my application I actually run a external program using the system.diagnostics,process.start command, to the IP of my PC’s this way, it will run each script and not wait.And each of time will exit accordingly.
System.Diagnostics.Process.Start(“C:\vb\Insteon_BumpClients\BumpClients\BumpClients\bin\Release\BumpClients.exe”, ” 192.168.0.102 ” + data_out + ” ” + port) ‘ Laptop
System.Diagnostics.Process.Start(“C:\vb\Insteon_BumpClients\BumpClients\BumpClients\bin\Release\BumpClients.exe”, ” 192.168.0.120 ” + data_out + ” ” + port) ‘
System.Diagnostics.Process.Start(“C:\vb\Insteon_BumpClients\BumpClients\BumpClients\bin\Release\BumpClients.exe”, ” 192.168.0.104 ” + data_out + ” ” + port) ‘