sergiu reznicencu sergiu reznicencu - 7 months ago 62
Vb.net Question

No UDP packets received using async method VB.Net

       I'm trying to send a picture over lan using UDP. I have to "cut" the picture into small packets and then reassemble it at the other end. So far I've made the server and almost the client (the server sends the picture). I've made some tests with BeginReceive and worked (on other project). Now I get nothing on the client(no error..nothing). Here's the code for the server:

Imports System
Imports System.IO
Imports System.Net
Imports System.Threading
Imports System.Net.Sockets
Imports System.Text.Encoding


Public Class Form1
Dim publisher As New Sockets.UdpClient(0)

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim sendbytes() As Byte = ASCII.GetBytes(txt1.Text)
Dim img As Image, img_stream As MemoryStream, buffer As Byte()
Dim packet_size As Integer = 1500, sent_size As Long


Try
publisher.Connect("localhost", 60000)
img_stream = imgToBytes(txt1.Text)

ReDim buffer(packet_size)

While Not img_stream.Position = img_stream.Length
sent_size += img_stream.Read(buffer, 0, packet_size)

publisher.Send(buffer, buffer.Length)
End While


Catch ex As Exception
Debug.Print(ex.Message)
End Try

End Sub

Function imgToBytes(ByVal file_name As String) As MemoryStream
Dim img As Image = Image.FromFile(file_name)
Dim stream As New MemoryStream

img.Save(stream, Drawing.Imaging.ImageFormat.Jpeg)
stream.Position = 0

Return stream
End Function

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Form2.Show()
End Sub
End Class


The client is on the second form:

Imports System
Imports System.IO
Imports System.Net
Imports System.Threading
Imports System.Net.Sockets
Imports System.Text.Encoding


Public Class Form2
Dim ep As IPEndPoint = New IPEndPoint(IPAddress.Any, 0)
Dim client As New UdpClient(1000)

Public Event new_msg(ByVal msg As Byte())
Public Sub client_msg(ByVal msg As Byte())
Debug.Print("a")
End Sub

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Try ''don't know why I put this here
client.BeginReceive(New AsyncCallback(AddressOf receive), client)

Catch ex As Exception
Debug.Print(ex.Message)
End Try
End Sub

Sub receive(ByVal ar As IAsyncResult)
Dim buffer As Byte()
Debug.Print("b")

Try
buffer = client.EndReceive(ar, ep)
''RaiseEvent new_msg(buffer)

client.BeginReceive(New AsyncCallback(AddressOf receive), client)
Catch ex As Exception
Debug.Print(ex.Message)
End Try
End Sub

End Class



       Where is the problem?

Answer

Your problem is that your clients are not communicating over the same port.

In Form2 you do:

Dim client As New UdpClient(1000)

Then in Form1 when you connect you do:

publisher.Connect("localhost", 60000)

Change the port to 1000 and it works:

publisher.Connect("localhost", 1000)