Search code examples
vb.netsocketsudppackets

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?


Solution

  • 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)