ASIO UDP Communication stops working when entering a thread
Have created a class to allow UDP communication using ASIO // Header class UdpClient { public: UdpClient(); void Open(string ipaddr, string port); void Send(string packet); void Close(); private: bool init; string ipAddress; string Port; udp::endpoint Endpoint; udp::socket *pSocket; udp::socket *s; }; // Part of code void UdpClient::Open(string ipaddr, string port) { ipAddress = ipaddr; Port = port; boost::asio::io_service io_service; udp::resolver resolver(io_service); udp::resolver::query query(udp::v4(), ipaddr,port); Endpoint = *resolver.resolve(query); pSocket = new udp::socket(io_service); pSocket->open(udp::v4()); pSocket->send_to(boost::asio::buffer(first.c_str(), first.size()), Endpoint); std::cout << "Opening port [" + Port + "] on " + ipAddress + "\n"; init = true; } void UdpClient::Send(string packet) { if (init) { pSocket->send_to(boost::asio::buffer(packet.c_str(), packet.size()), Endpoint); } } --------------- Another class implements more advanced communication. // Extracts extern UdpClient endpoint; void UdpDebug::WriteLine(string line) { line = "[" + Clock.Now() + "]" + line; endpoint.Send(line); }; ------------------------ In my main program i declare two global variables. UdpDebug DebugPort; UdpClient endpoint; The I init the UDP communication by calling endpoint.Open(IPAddress, UDPPort); after that I can write to the UDP enpoint by: DebugPort.WriteLine("Debug working!"); Have declared a thread: boost::thread t1(Initialize); void Initialize() { DebugPort.WriteLine("Debug working in the thread"); for (int i = 0; i < MAX; ++i) { wait(1); std::cout << "Thread 1: " << i << std::endl; } } When I do t1.join(); The thread starts printing out "Thread1: <number>" on the terminal but no UDP output is received on the other end. Any clues why this won't work? Are starting two threads, but only one of them is attempting UDP communication. If I put a wait statement inside the main program, and attempt UDP communication after the threads have executed a few seconds, this will still work. Also tried creating a new instance of UdpClient inside the thread. Opened it, and tried to send data, to no avail. Any clues? BR Ulf Samuelsson
On 2013-09-25 21:58, Ulf Samuelsson wrote:
Have created a class to allow UDP communication using ASIO
Think I found the problem. Added a method, to allow me to do "io_service.run()" on the endpoint in use, and then it works. void UdpClient::Run (void) { io_service.run() } which is called by main: endpoint.Run() and then I get output. Reading up a bit more, I realize I have to be careful, if I try to use UDP on this port in more than one thread. BR Ulf
// Header class UdpClient { public: UdpClient(); void Open(string ipaddr, string port); void Send(string packet); void Close(); private: bool init; string ipAddress; string Port; udp::endpoint Endpoint; udp::socket *pSocket; udp::socket *s; };
// Part of code void UdpClient::Open(string ipaddr, string port) { ipAddress = ipaddr; Port = port;
boost::asio::io_service io_service;
udp::resolver resolver(io_service); udp::resolver::query query(udp::v4(), ipaddr,port); Endpoint = *resolver.resolve(query);
pSocket = new udp::socket(io_service); pSocket->open(udp::v4()); pSocket->send_to(boost::asio::buffer(first.c_str(), first.size()), Endpoint);
std::cout << "Opening port [" + Port + "] on " + ipAddress + "\n"; init = true; }
void UdpClient::Send(string packet) { if (init) { pSocket->send_to(boost::asio::buffer(packet.c_str(), packet.size()), Endpoint); } }
--------------- Another class implements more advanced communication.
// Extracts extern UdpClient endpoint;
void UdpDebug::WriteLine(string line) { line = "[" + Clock.Now() + "]" + line; endpoint.Send(line); };
------------------------
In my main program i declare two global variables.
UdpDebug DebugPort; UdpClient endpoint;
The I init the UDP communication by calling
endpoint.Open(IPAddress, UDPPort);
after that I can write to the UDP enpoint by:
DebugPort.WriteLine("Debug working!");
Have declared a thread:
boost::thread t1(Initialize);
void Initialize() { DebugPort.WriteLine("Debug working in the thread"); for (int i = 0; i < MAX; ++i) { wait(1); std::cout << "Thread 1: " << i << std::endl; } }
When I do
t1.join();
The thread starts printing out "Thread1: <number>" on the terminal but no UDP output is received on the other end.
Any clues why this won't work?
Are starting two threads, but only one of them is attempting UDP communication.
If I put a wait statement inside the main program, and attempt UDP communication after the threads have executed a few seconds, this will still work.
Also tried creating a new instance of UdpClient inside the thread. Opened it, and tried to send data, to no avail.
Any clues?
BR Ulf Samuelsson
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
participants (1)
-
Ulf Samuelsson