network programming - boost::asio doesn't work -
निम्नलिखित वर्ग के साथ
हैडर:
नामस्थान msgSrv {Class endPoint {सार्वजनिक: asio :: ip :: udp :: endpoint ep; एंड पॉइंट (std :: string ip, int port); }; क्लास msgSrv {निजी: asio :: ip :: udp :: socket * asioSocket; Asio :: io_service * asioIoService; Int listenPort; बढ़ावा :: सरणी & lt; char, 1 & gt; rcvBuff; Asio :: ip :: udp :: endpoint lastRcvdPcktEndp; चार * sbuff; सार्वजनिक: बढ़ावा :: condition_variable cond; Boost :: mutex mut; MsgSrv (int listenPort); वर्चुअल ~ msgSrv (); शून्य प्रारंभ (); शून्य pckRcvd (const asio :: error_code और त्रुटि, std :: size_t bytes_transferred); शून्य प्रेषित (कॉन्स्ट चार् * ब्रेफ, इंट लेन, एंडपेईंट एपी); शून्य प्रेषण (कॉन्स्ट एएसआईओ :: त्रुटिगोड और त्रुटि, std :: size_t bytes_transferred); }; }
। Cpp
#include "msgSrv.h" नामस्थान msgsrv {endpoint :: endpoint (const std :: string ip, int port) {Asio :: ip :: address addr = asio :: ip :: address :: from_string (आईपी); Ep = asio :: ip :: udp :: अंत बिंदु (एडिट, पोर्ट); } MsgSrv :: msgSrv (int listenPort) {// स्वतः ऑटो-जेनरेट किया गया निर्माता स्टब यह- & gt; listenPort = listenPort; {AsioIoService = new asio :: io_service () का प्रयास करें; AsioSocket = new asio :: ip :: udp :: socket (* asioIoService, asio :: ip :: udp :: अंत बिंदु (asio :: ip :: udp :: v4 (), listenPort)); // नया asio :: ip :: udp :: socket _ (* asioIoService, udp :: endpoint (udp :: v4 (), listenPort)); } पकड़ (std :: exception & amp; ई) {std :: cerr & lt; & lt; "Ioservice या सॉकेट को आरंभ करने में त्रुटि:" & lt; & lt; e.what (); } AsioIoService- & gt; रन (); } MsgSrv :: ~ msgSrv () {// स्वत: उत्पन्न जनरेटर स्टब हटायें asioIoService; AsioSocket हटाएं; } Void msgSrv :: start () {asioSocket-> async_receive_from (asio :: buffer (rcvBuff), lastRcvdPcktEndp, boost :: bind (& amp; msgsrv :: pckRcvd, यह, asio :: placeholders :: error, asio :: प्लेसहोल्डर :: bytes_transferred)); } शून्य msgSrv :: pckRcvd (const asio: error_code & error, std :: size_t bytes_transferred) {std :: cout & lt; & lt; "आरसीवीडी!" & Lt; & lt; LastRcvdPcktEndp.address ()। To_string () & lt; & lt; ":" & Lt; & lt; LastRcvdPcktEndp.port () & lt; & lt; "\ N"; } शून्य msgSrv :: sendTo (const char * buff, int len, endpoint ep) {sbuff = new char [len]; Mempcpy (sbuff, buff, len); AsioSocket- & gt; async_send_to (asio :: बफर (sbuff, len), ep.ep, बढ़ावा :: बाँध (और msgsrv :: sendHnd, this, asio :: placeholders :: error, asio :: placeholders :: bytes_transferred) ); } शून्य msgSrv :: sendHnd (const asio :: error_code और त्रुटि, std :: size_t bytes_transferred) {std :: cout & lt; & lt; "! Snt \ n"; Sbuff हटाएं; }}
और निम्न "मुख्य" फ़ाइल:
int main () {msgSrv :: msgSrv aa (4450); aa.start (); MsgSrv :: endPoint ep ("127.0.0.1", 4450); Std :: स्ट्रिंग a ("प्रावा!"); Int len = a.length (); Aa.sendTo (a.c_str (), लेन, एपी); Std :: cout & lt; & lt; "भेजा ... \ n"; Std :: cout & lt; & lt; "अधिसूचित ... \ n"; }
सभी मुझे मिल रहा है:
समाप्त 'asio :: system_error' का एक उदाहरण फेंकने के बाद कहा जाता है क्या:): mutex: अमान्य तर्क भेजा गया है। .. अधिसूचित ...
क्या गलत है ?? मैंने भी थोड़ी देर (1) को मुख्य में रखने की कोशिश की, यह देखने के लिए कि कुछ होता है ... मैंने मुख्य में एक शर्त डालनी भी कोशिश की जो प्राप्तकर्ता द्वारा प्राप्त अनलॉक है ... सब कुछ बंद रहता है ... तो क्या ??? कोई विचार नहीं!
मुझे नहीं लगता कि आप वास्तव में किसी भी muxtex को लॉक कर रहे हैं, ताकि त्रुटि अजीब हो। < / P>
हालांकि आपकी समस्या निर्माता के अंदर बुला रही है, अनंत लूप में चुड़ैल गिरावट इसका समाधान एक नया, चुड़ैल कॉल asioIoService- & gt; रन ()
ही है यह धागा सभी नौकरियों की प्रक्रिया करेगा। आप एक ही समय में एक और अधिक कार्यवाही करने के लिए एक और थ्रेड के साथ asio :: io_service :: run () भी कॉल कर सकते हैं।
m_thread = new boost :: thread को बढ़ावा देने :: बाँध (& amp; asio :: io_service :: रन asioIoService));
कॉलिंग एएसआईओ :: io_service :: run () से बाहर निकलेगा, इस प्रकार धागा को बंद कर दिया जाएगा। <धागा समाप्त करने से पहले यह सुनिश्चित करने के लिए आपको इस थ्रेड में शामिल होना चाहिए कि आपके msgsrv वर्ग के नाशक में asioIoService
सूचक।
Comments
Post a Comment