UDP Recieve, maar eerst Bind

Pagina: 1
Acties:
  • 277 views sinds 30-01-2008
  • Reageer

  • Depress
  • Registratie: Mei 2005
  • Laatst online: 24-11 21:01
Hallo,

Ik wil een udp datagram ontvangen, maar ik heb het probleem dat hij een fout geef en dat ik dus eerst de BIND method moet aanroepen.

Mijn code is als volgt:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
UdpClient Client = new UdpClient();
            IPEndPoint Sender = new IPEndPoint(IPAddress.Any, 0);
            
            try
            {
                byte[] Data = Client.Receive(ref Sender);
                int Value = BitConverter.ToInt32(Data, 0);
                this.label1.Text = "Recieved Value: " + Value;
                this.progressBar1.Value = Value;
            }
            catch (Exception error)
            {
                MessageBox.Show(error.Message);
            }


Hij gaat fout op de regel van de Client.Recieve. De precieze foutmelding is als volgt:
"You must call the Bind method before performing this operation."

Wie weet wat er fout gaat, heb al op msdn gekeken en verschillende andere sites over de udp client en het ontvangen van datagrammen.

  • igmar
  • Registratie: April 2000
  • Laatst online: 30-11 18:38

igmar

ISO20022

Nou, euh, je moet eerst binden ?

  • Depress
  • Registratie: Mei 2005
  • Laatst online: 24-11 21:01
Ja goh, maar hoe word dat gedaan?

Ik heb geen bind methode kunnen vinden in de UDP Client

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ja goh, misschien iets met de constructor van de client?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • VyperX
  • Registratie: Juni 2001
  • Laatst online: 12-11 16:48
Het gaat fout bij de constructor van je UdpClient.
Jij gebruikt:
C#:
1
UdpClient Client = new UdpClient(); 


Volgens de MSDN maak je hiermee een 'losse' UdpClient aan, die nog niet gebonden is aan een specifieke poort. Uit de MSDN:
This constructor is not suitable for joining a multicast group because it does not perform socket binding. Also, it works only with IPv4 address types.
Als je een van de andere Constructors gebruikt (bijv. UdpClient(Int32 portnumber); ), dan wordt je Client wel gebonden aan een poort.

My Dwarf Fortress ASCII Reward: ~~@~~####,.".D",.B""


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:10

TeeDee

CQB 241

edit:
even wat beter voorbeeld zoeken


Hmm, wat VyperX zegt. Je zal in ieder geval nog een PortAssignment moeten opgeven in je constructor.
.oisyn schreef op dinsdag 19 juni 2007 @ 11:07:
TeeDee: Een Socket is een low-level class waar UDPClient op layered. UDPClient is dus wat handiger in het gebruik (en creeert intern weer een Socket, dat hoef jij niet te doen)
Mjah, goed dat je het zegt. Heb weinig ervaring met Sockets/UDP/TCP en de info die ik had heb ik gewoon op MSDN gevonden.

[ Voor 198% gewijzigd door TeeDee op 19-06-2007 11:10 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

TeeDee: Een Socket is een low-level class waar UDPClient op layered. UDPClient is dus wat handiger in het gebruik (en creeert intern weer een Socket, dat hoef jij niet te doen)

[ Voor 4% gewijzigd door .oisyn op 19-06-2007 11:07 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Je moet namelijk opgeven van wie je een packet wilt ontvangen.
code:
1
2
3
4
5
6
7
8
9
UdpClient client = new UdpClient();  //local variables are camel cased (first letter lowercase!)
while(true)
{
  byte b = client.Receive(new IPEndPoint(IPAddress.Any, 8032));
  //do something..
  if (b == (byte) 0)
    break;
}
client.Close();


Overigens is de Socket class eenvoudiger in gebruik met UDP omdat je dan direct een byte array kunt ontvangen ipv de bytes 1 voor 1.

Een goed startpunt is denk ik gewoon de MSDN Documentatie. Daarin staat een klant en klaar voorbeeld hoe je UDP data kunt verzenden EN ontvangen. Google gewoon ff op System.Net.Sockets.UdpClient en je vind genoeg websites (waaronder de MSDN website van Microsoft) met tientallen voorbeelden.

If it isn't broken, fix it until it is..


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Euh, Niemand_Anders, ik denk dat je zelf de docs van UdpClient nog maar even goed moet gaan lezen, want er klopt geen zak van je beweringen.

Ten eerste geeft de parameter van Receive() niet aan van wie je 'm wilt ontvangen - je moet een variabele opgeven waar het resultaat in komt te staan, dus van wie je 'm hebt ontvangen (het is ook een 'ref', jouw new op die plek gaat dus niet werken)

Ten tweede geeft Receive() gewoon een byte array terug, en niet een enkele byte.

[ Voor 4% gewijzigd door .oisyn op 19-06-2007 12:47 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1