i have a server and a client(run on the same machine, for testing purposes). this is basically, sorry for it, a help thread. but i've been searching, tracing, retracing, researching for days now to no avail(unlike other problems ive encountered while coding this, i just cant fix or solve this) so yeah.
client connects(server automatically listens)
server "looks" at the screen of the client 'no problems
now if the client is closed(by client) or disconnected(by server) 'sending of bitmaps stops
and i reconnect the client
the client goes into "not responding mode"
i can send messages or other commands(disconnect, shutdown, lock) just fine though.
but when i ask for the server to "look at the screen" of the client again... yeah "not responding" - prolly a loop or something.
ive tried tracing it but i really cant find whats wrong.
sidenote: sorry for the way my code is.
Dim ipAddress As IPAddress = ipAddress.Parse("127.0.0.1") Dim IpEndPoint As IPEndPoint = New IPEndPoint(ipAddress, 8000) Dim client As New TcpClient Dim nstream As NetworkStream Dim byteData(1023) As Byte
when connect button is pressed:
Try client = New System.Net.Sockets.TcpClient client.BeginConnect(ipAddress, 8085, New AsyncCallback(AddressOf OnConnect), Nothing) Catch ex As Exception MsgBox("Failed to connect...") Exit Sub End Try Private Sub OnConnect(ByVal ar As IAsyncResult) Try client.EndConnect(ar) Catch ex As Exception MsgBox("Failed to connect...") Exit Sub End Try SetText("Connected") 'settext is for changing GUI (textbox is this case, im sure its not relevant) client.Client.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None, New AsyncCallback(AddressOf OnRecieve), client) End Sub Private Sub OnRecieve(ByVal ar As IAsyncResult) Dim client As TcpClient = ar.AsyncState Try client.Client.EndReceive(ar) Catch ex As Exception Exit Sub End Try Dim bytesRec As Byte() Dim message As String bytesRec = Nothing message = Nothing bytesRec = byteData message = System.Text.ASCIIEncoding.ASCII.GetString(bytesRec) Read(message) 'read.. well reads the message and checks if its a message or command from the server 'if you have pressing need to see this Sub just post but im telling you the way i work is really. weird. Try client.Client.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None, New AsyncCallback(AddressOf OnRecieve), client) Catch ex As ObjectDisposedException Exit Sub End Try End Sub
when Read() receives a certain from the server and lets say that string was to - tell the client to start sending the bitmaps for monitoring
timer starts :
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick SendImage() End Sub
does SendImage() everytick
Private Sub SendImage() Dim bf As New BinaryFormatter Try nstream = client.GetStream 'client is a TCPClient bf.Serialize(nstream, Desktop()) Catch ex As Exception Timer1.Stop() MsgBox("Connection Has Been Severed", MsgBoxStyle.Critical, "Connection Severed") SetText("Not Connected") cmdConnect.Enabled = True End Try End Sub
Public Function Desktop() As Image Dim bounds As Rectangle = Nothing Dim screenshot As System.Drawing.Bitmap = Nothing Dim graph As Graphics = Nothing bounds = Screen.PrimaryScreen.Bounds screenshot = New Bitmap(bounds.Width, bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb) graph = Graphics.FromImage(screenshot) graph.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy) Return screenshot End Function
well the server sends the "command" string to the client
' tell all clients not to send anything For Each client As TcpClient In CoCC 'CollectionofConnectedClients Try Send("NOTMONITOR", items) Catch ex As System.ArgumentOutOfRangeException MsgBox("No Freaking Nothing") Exit Sub End Try Next ' code to tell a specific client to send bitmaps - be noisy Try Send("MONITOR890", lsvClients.SelectedItems(0).Tag) Catch ex As System.ArgumentOutOfRangeException MsgBox("No Freaking Nothing") Exit Sub End Try If continuemonitor = 1 Then ' if error was found on silencing the clients continuemonitor = 0 ' return to 0 Exit Sub '... dont continue End If endpointmoni = lsvClients.SelectedItems(0).Text ' to tell which client to get from | endpointmoni is a TCPClient iwannagetendpoint = 1 ' |iwannagetendpoint is a trigger of sorts ContinueGetImage() ' this code to continue getting images
If iwannagetendpoint = 1 Then For Each clnt As TcpClient In CoCC If clnt.Client.LocalEndPoint.ToString = endpointmoni Then tobemonitored = clnt Exit For End If Next End If iwannagetendpoint = 0 While tobemonitored.Connected = True Try nstream = tobemonitored.GetStream Try PictureBox1.Image = bf.Deserialize(nstream) Catch serex As Exception 'serialize something exception StopGetImage() 'getimage(thread) runs on a while this sends a trigger so the while will become false RefreshClients() 'clears listview that show Connected clients and refresh them End Try Catch ioex As IOException StopGetImage() RefreshClients() End Try End While
i think ive put all the relevant codes. if you need anything more then please tell me.
ill be trying to fix this myself while i wait for an answer but... if i can do that.. well.. i would have. im really on my last rope here.