2015-10-28 24 views
10

मेरे पास शीर्षक वाले प्रश्न के बारे में एक प्रश्न है। इसलिए, मैं एक ऐसा प्रोग्राम बनाने का प्रयास कर रहा हूं जो सी ++ में किसी प्रोग्राम के बीच डेटा के लिए डेटा/अनुरोध पास करता है और एक अपाचे वेब सर्वर से चलने वाली एक PHP साइट।PHP और C++ के बीच संचार कैसे सेट करें?

मैं सॉकेट संचार का शोध कर रहा हूं, लेकिन मैं अवधारणा को समझ नहीं रहा हूं। मैं समझता हूं कि PHP में सॉकेट कैसे बनाएं, और दूसरा C++ में, और मैंने उन्हें एक परीक्षण अनुप्रयोग का उपयोग करके चलाया है। लेकिन केवल व्यक्तिगत रूप से, एक दूसरे से बात नहीं कर रहे हैं या मेरे वेब सर्वर से बात नहीं कर रहे हैं (PHP इस समय सर्वर पर नहीं है, यह एक अलग सर्वर पर है)। यह कैसे काम करता है? मेरी समझ से, आपको पोर्ट नंबर को सुनने के लिए एक और दूसरे को उस कमांड को कुछ भेजने की आवश्यकता है।

आदर्श रूप में, मैं इसे प्राप्त करने में मेरी सहायता के लिए किसी भी पुस्तकालय का उपयोग नहीं करना चाहूंगा। मुझे पता है कि इस सवाल से कई बार पूछा गया है, लेकिन मुझे अभी भी कहीं भी नहीं मिल रहा है।

कोई व्यक्ति उपर्युक्त कार्यों, या यहां किसी अन्य प्रश्न के लिंक के बारे में स्पष्टीकरण प्रदान कर सकता है जो मदद की हो सकती है? या यदि सॉकेट का उपयोग करने से ऐसा करने का कोई बेहतर तरीका है? वे एक दूसरे से बात करेंगे, और शायद एक मुद्दा हो सकता है।

संपादित करें, और स्पष्टीकरण:

वेब सर्वर: मैं एक Apache वेब सर्वर चल रहा हूँ। PHP स्क्रिप्ट इस सर्वर पर स्थित है।

सी ++ स्थान: परीक्षण करते समय, मेरा सी ++ एप्लिकेशन उसी रास्पबेरी पीआई पर संग्रहीत होता है जिस पर वेब सर्वर चल रहा है। वास्तविक एप्लिकेशन में, मेरा सी ++ एप्लिकेशन अभी भी उसी डिवाइस पर संग्रहीत होगा (लेकिन यह रास्पबेरी पीआई नहीं होगा - फिर भी लिनक्स आधारित)।

संचार: PHP स्क्रिप्ट को C++ स्क्रिप्ट द्वारा चीजों को करने के लिए ट्रिगर करने की आवश्यकता होगी, और इसके विपरीत। उन्हें डेटा (सामान्य डेटा संरचनाएं, लेकिन वे काफी बड़े हो सकते हैं) को पारित करने की आवश्यकता होगी (इसलिए दोनों को डेटा भेजने और प्राप्त करने में सक्षम होना चाहिए)।

+1

आप कहते हैं कि php एप्लिकेशन C++ app से एक अलग सर्वर पर है? क्या यह हमेशा मामला होगा? – commanderZiltoid

+2

यह सवाल बहुत अस्पष्ट है। क्या दोनों कार्यक्रम एक ही सर्वर पर चल रहे होंगे? एक रास्ता या दो तरह से संचार? क्या यह क्लाइंट/सर्वर प्रकार का रिश्ता है? या शायद एक कार्यकर्ता/कतार प्रकार संबंध? क्या एक वेबसर्वर (अपाचे, एनएनजीएक्स इत्यादि) के पीछे PHP चल रहा है? – Steve

+1

नमस्ते, कृपया अपने उपयोग-मामले पर विस्तृत करें, दोनों एक ही प्रोटोकॉल का उपयोग करते समय संवाद कर सकते हैं, यदि आपका PHP वेबसर्वर पर है, तो यह सबसे अच्छा http/https (मुझे लगता है कि सी ++ क्लाइंट और PHP सर्वर है)। यदि php cli है, तो आपका विकल्प udp, tcp तक विस्तारित हो सकता है। आप सी ++ का उपयोग करके ईमेल भी भेज सकते हैं और PHP का उपयोग करके चेक प्राप्त कर सकते हैं, समय-समय पर wget और cron job, आदि का उपयोग कर –

उत्तर

13

मुझे लगता है कि सबसे आसान तरीका है:

1) पीएचपी -> सी ++: टीसीपी

2) सी ++ -> पीएचपी: http

समझाने की कोशिश करेंगे।

1) सी ++ ऐप से कुछ लेने के लिए PHP stream_socket_client फ़ंक्शन का उपयोग करके उस ऐप से कनेक्ट होता है। सी ++ ऐप मेजबान और बंदरगाह पर socket, bind और listen फ़ंक्शंस का उपयोग कर सुन रहा है। जैसे ही कनेक्शन सी ++ ऐप accept आता है और फिर एक अलग std::thread में अनुरोध प्राप्त करने के लिए अनुरोध (recv) पर प्रतिक्रिया देता है)। How to socket

2) चूंकि PHP अपाचे वेब सर्वर के तहत काम कर रहा है, मुझे लगता है कि सी ++ ऐप से HTTP अनुरोध करने के लिए सबसे आसान तरीका libcurl लाइब्रेरी का उपयोग करना है। How to curl

+0

विस्तृत उत्तर के लिए धन्यवाद। मैं इस सप्ताह के अंत में इसे आजमाने की कोशिश कर रहा हूं। मैं वापस आऊंगा और इसे अपने उत्तर के रूप में चिह्नित कर सकता हूं अगर यह अच्छी तरह से काम करता है :) – mfisher91

7

एक और दृष्टिकोण SOAP या REST वेब सेवाएं हो सकती है। दोनों तरफ, आप डेटा का आदान-प्रदान करने या दूरस्थ कार्यों को कॉल करने के लिए एक एसओएपी वेब सेवा प्रदान कर सकते हैं। सी ++ - तरफ, आप एक एसएएपी सर्वर प्रदान करने के लिए अपाचे एक्सिस का उपयोग कर सकते हैं। PHP पक्ष पर, आप बिल्ड-इन SOAPServer क्लास (http://php.net/manual/de/class.soapserver.php) का उपयोग कर सकते हैं।

SOAP के साथ आप बस HTTP/HTTPS पर दोनों अनुप्रयोगों के बीच एक्सएमएल-आधारित संदेशों का आदान-प्रदान करेंगे। इस दृष्टिकोण के साथ, दोनों अनुप्रयोग एक-दूसरे को ट्रिगर कर सकते हैं और डेटा का आदान-प्रदान कर सकते हैं।

+1

आईएमओ यह सबसे अच्छा समाधान है क्योंकि यह सेट अप करने के लिए थोड़ा सा काम करता है, लेकिन यह सबसे लचीलापन प्रदान करता है और यदि ओपी एक को बदलने का फैसला करता है कार्यक्रम में इसे तोड़ने की सबसे कम संभावना है और इसे ठीक करने का सबसे आसान तरीका है (बस सुनिश्चित करें कि आरईएसटी या एसओएपी वेब सेवा इरादे से काम कर रही है)। यह एक अलग भाषा में बदलाव की अनुमति देता है। – smcjones

+1

अपाचे/PHP मूल रूप से HTTP का उपयोग करने के लिए डिज़ाइन किया गया है। रेस्टफुल या एसओएपी, या जेएसओएन आधारित समकक्ष प्रचलित हैं और न्यूनतम ओवरहेड के साथ आपके लिए समस्या का समाधान करेंगे, क्योंकि आप कई ढांचे को पा सकते हैं जो आपके लिए अधिकांश संरचनात्मक काम करेंगे। – sibaz

1

आप क्या stas आप तो कहा कि मैं सुझाव है कि आप

को देखने पर कुछ मार्गदर्शन की जरूरत है

http://us2.php.net/manual-lookup.php?pattern=fsock&src= {referrer: स्रोत} http://us2.php.net/manual-lookup.php?pattern=socket&src= {referrer: स्रोत}

C++ में आप करना चाहते हैं एक टीसीपी श्रोता बनाएं जो कमांड स्वीकार करता है (स्पष्ट रूप से आप सत्यापन की कुछ विधि डालना चाहते हैं), फिर कनेक्शन खोलने के लिए PHP का उपयोग करें (fsock या सॉकेट अपनी पसंद का उपयोग करें - fsock आसान है), और अपने सी ++ श्रोता को डेटा लिखें । stream_socket_client

आप कर सकते हैं: php जांच इसके लिए http://www.linuxhowtos.org/C_C++/socket.htm

: यह ezpz

// कुछ उदाहरण कोड

// protocol://ip, port, $errno, $errstr, $timeout 
$fp = fsockopen("tcp://ip", 1337, $errno, $errstr, 30); 
if(!$fp) die('failed connection or something'); 

//write something 

fwrite($fp, "stuffs to write"); 

// get a reply? 

while (!feof($fp)) { 
    echo fgets($fp, 128); // where 128 is size 
} 
1

मैं आप इस जाँच ++ यूनिक्स सॉकेट उपयोग करने के लिए ग के लिए सलाह देते हैं साथ अद्यतन करने है दोनों प्रक्रियाओं से आंतरिक रूप से जानकारी पास करें।

आशा है कि आप इसे हल कर सकते हैं, हार न दें।

1

एक एसओएपी समाधान समस्या हल करने वाला कुछ हो सकता है, लेकिन मेरी राय में यह एप्लिकेशन परिनियोजन को बहुत जटिल बनाता है।

आप कुछ स्तर नीचे जा सकते हैं और सीधे XML-RPC के साथ काम कर सकते हैं।

यहां आपके दो दिलचस्प लिंक हैं, जो दिखाते हैं कि क्लाइंट और सर्वर दोनों भाषाओं में कैसे कार्यान्वित किया जाए।

XML-RPC for C++

XML-RPC for PHP

सी के लिए XML-RPC++ (मैं PHP के साथ इस दृष्टिकोण उपयोग नहीं किया है, तो मैं दूसरों के विकल्प पता नहीं है) के अन्य implementatios रहे हैं, साथ ही टिक नहीं पाता एक, दूसरों के साथ प्रयास करें और आप जो अधिक सहज महसूस करते हैं उसका उपयोग करें।

2

बेन Schnarr के जवाब में जोड़ना, मुझे लगता है कि शायद सबसे सुरुचिपूर्ण और आसान समाधान सी ++ प्रोग्राम PHP कोड में लागू वेब सेवाओं के लिए एक क्लाइंट बनाने के लिए होगा। सॉकेट का उपयोग करने से आप संचारित होने वाले डेटा का प्रतिनिधित्व करने के लिए एक अतिरिक्त प्रोटोकॉल कर सकते हैं (जब तक कि डेटा ASCII पाठ की धारा की तरह छोटा न हो), जो पहिया को फिर से शुरू करने जैसा थोड़ा सा होगा।

मैं आरईएसटी + जेएसओएन के आंशिक हूं, क्योंकि वे लागू करने और उपयोग करने के लिए सरल हैं, और बहुत शक्तिशाली हैं। इसके विपरीत, एसओएपी काफी जटिल है, संसाधनों में भारी है, और भंगुर है, खासकर अगर आप इसे सी ++ के साथ उपयोग करते हैं। उदाहरण के लिए, मैंने पहले से ही एक लोकप्रिय कार्यान्वयन का उपयोग किया है, जब भी आप किसी भी संदेश का लेआउट बदलते हैं, भले ही सर्वर उस फ़ील्ड को जोड़ रहा हो जो ग्राहक उपयोग नहीं करेगा।

PHP पक्ष पर, यह काफी आसान है - इसमें पहले से ही आपके पास आवश्यक सभी बुनियादी ढांचे हैं। सी ++ प्रोग्राम पर, आपको जितनी न्यूनतम आवश्यकता होगी वह एक HTTP क्लाइंट लाइब्रेरी और एक JSON कोडेक होगा। मैं पहले के लिए libcurl (अब तक सबसे लोकप्रिय) और jsoncpp बाद के लिए उपयोग करता हूं, लेकिन दोनों के लिए अन्य विकल्प हैं। हाल ही में, कुछ पुस्तकालय पूरे पैकेज के साथ दिखाई दिए, लेकिन मुझे अभी तक उनका उपयोग करने का मौका नहीं मिला था।कुछ उदाहरण:

restclient

REST SDK

Restbed

संबंधित मुद्दे