Zdarec,
řeším menší problém, jako obyčejně na w32 bez problému ale na CF ve WM5 jsem mimo.
Potřebuji komunikovat v LAN (konkrétně wifi) nespojovaně (alespoň zpočátku), protože neznám adresu protějšku.
Rozhodl jsem se tedy využít UDP, kte můžu posílat i přijímat přes broadcast. Problém je v tom, že v CF není u třídy "UdpClient" vlastnost "Available" ani asynchronní metody. Jelikož udp dotaz má sloužit ke zjištění cíle, nemusí logicky žádná odpověď (krom toho, že se mi vrátí můj dotaz) přijít a v tu chvíli aplikace zamrzne.
Zkusil jsem to tedy přepsat místo "UdpClient" na "Socket". Zatím testuji na w32
// init
sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
sock.EnableBroadcast = true;
sock.Blocking = true; // nema vliv na nefunkcnost
sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 5000);
// odeslani
sock.SendTo(buff, SocketFlags.DontRoute, new IPEndPoint(IPAddress.Broadcast, lisPort));
// odesila, ošem při použití UdpClient pro příjem to ukazuje nesprávný port
// data odeslaná z UdpClient jsou přijata se správným portem
// prijem
sock.ReceiveFrom(receivedData, SocketFlags.None, ref endpoint);
// končí výjimkou "Před provedením této operace je třeba zavolat metodu Bind."
// volání "Bind" končí buď už u něho výjimkou (o nepoužitelné adrese) nebo později v ReceiveFrom s obdobnou hláškou.
Věděla by nějaká dobrá duše co s tím? Nebo jiný nápad, jak využít lokální LAN jen jako všesměrové přenosové médium bez adresace. Prostě jen poslat data na sí
ť a ať si je chytne, kdo je zrovna vidí. S úplnou třídou "UdpClient" mi to chodí, ale s osekanou na CF už nevím jak na to.
Zdarec,
řeším menší problém, jako obyčejně na w32 bez problému ale na CF ve WM5 jsem mimo.
Potřebuji komunikovat v LAN (konkrétně wifi) nespojovaně (alespoň zpočátku), protože neznám adresu protějšku.
Rozhodl jsem se tedy využít UDP, kte můžu posílat i přijímat přes broadcast. Problém je v tom, že v CF není u třídy "UdpClient" vlastnost "Available" ani asynchronní metody. Jelikož udp dotaz má sloužit ke zjištění cíle, nemusí logicky žádná odpověď (krom toho, že se mi vrátí můj dotaz) přijít a v tu chvíli aplikace zamrzne.
Zkusil jsem to tedy přepsat místo "UdpClient" na "Socket". Zatím testuji na w32
// init
sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
sock.EnableBroadcast = true;
sock.Blocking = true; // nema vliv na nefunkcnost
sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 5000);
// odeslani
sock.SendTo(buff, SocketFlags.DontRoute, new IPEndPoint(IPAddress.Broadcast, lisPort));
// odesila, ošem při použití UdpClient pro příjem to ukazuje nesprávný port
// data odeslaná z UdpClient jsou přijata se správným portem
// prijem
sock.ReceiveFrom(receivedData, SocketFlags.None, ref endpoint);
// končí výjimkou "Před provedením této operace je třeba zavolat metodu Bind."
// volání "Bind" končí buď už u něho výjimkou (o nepoužitelné adrese) nebo později v ReceiveFrom s obdobnou hláškou.
Věděla by nějaká dobrá duše co s tím? Nebo jiný nápad, jak využít lokální LAN jen jako všesměrové přenosové médium bez adresace. Prostě jen poslat data na sí
ť a ať si je chytne, kdo je zrovna vidí. S úplnou třídou "UdpClient" mi to chodí, ale s osekanou na CF už nevím jak na to.
Citovat příspěvek