2010-10-31 5 views
5

में आउटपुट सिस्टम ("पिंग") आउटपुट मैंने एक साधारण प्रोग्राम लिखा है जो तीन साइटों को पिंग करता है और फिर प्रतिक्रिया करता है कि वे पहुंच योग्य हैं या नहीं।सी ++

मेरा सवाल है: क्या मैं सिस्टम ("पिंग") आउटपुट दबा सकता हूं? मैंने अपना कोड सी ++ में लिखा है क्योंकि मुझे वह भाषा अच्छी तरह से पता है। वर्तमान में कोड ping.exe सिस्टम कमांड चला रहा है। अगर मैं आउटपुट को दिखने से रोक सकता हूं, जबकि यह अभी भी पिंग्स है जो आदर्श होगा।

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

+0

क्या Win32 एप्लिकेशन (WinMain() के साथ) कमांड लाइन को दिखने से रोकता है? –

+0

जोड़ा गया 'विंडोज़' टैग। – vitaut

+1

मुझे आउटपुट को दबाने के बारे में पता नहीं है, लेकिन पिंगिंग उन परिस्थितियों में से एक है जहां आप आमतौर पर सिस्टम() से बचते हैं। –

उत्तर

16

system("ping host > nul") (nul करने का प्रयास करें यूनिक्स /dev/null के विंडोज़ समतुल्य है)।

+2

यदि मैं केवल आपको जवाब के रूप में चिह्नित कर सकता हूं ... लेकिन दुख की बात है कि मैंने सवाल नहीं पूछा। –

+4

कोलन की कोई ज़रूरत नहीं है, "नूल" काफी पर्याप्त है। – avakar

+0

धन्यवाद , यह उत्तर बहुत संक्षिप्त और भयानक है। – Samuel

3

आप पिंग कमांड के आउटपुट को दबाने के लिए नीचे सिस्टम कमांड का उपयोग कर सकते हैं।

system("ping 100.100.100.100 > response.dat"); 

ऊपर आदेश पिंग्स आईपी पते 100.100.100.100 और response.dat नामक एक फाइल करने के लिए उत्पादन निर्देशन। प्रतिक्रिया में। आप पिंग कमांड की प्रतिक्रिया देख सकते हैं।

+0

धन्यवाद bjskishore, यह जानना बहुत अच्छा है कि मैं कैसे यदि आवश्यकता हो तो आउटपुट को आउटपुट भेज सकते हैं। – Samuel

2

सिस्टम करें ("पिंग साइट.com> नूल 2> नूल"); और शेल रिटर्न के मूल्य की जांच करें। यदि पिंग सफल हो जाता है, तो खोल 0 वापस आ जाएगा, अन्यथा यह वापस आ जाएगा 1. मैं अधिक विस्तृत होगा, लेकिन वीस स्टूडियो स्वयं को पुनर्स्थापित कर रहा है। :)

कमांड निष्पादित करने के लिए विन एपीआई का उपयोग कर कंसोल विंडो को छिपाने का एक तरीका भी है, लेकिन ... मुझे विवरण याद नहीं है।

संपादित करें: मैं अभी भी dwCreationFlags पैरामीटर कंसोल विंडो को छिपाने के लिए के लिए MSVS प्रक्रिया स्थापित के लिए इंतज़ार कर रही है, इसलिए ... :) उपयोग CreateProcess DETACHED_PROCESS ध्वज के साथ।

जब आप प्रक्रिया बनाते हैं, तो आपको पिंग को पूरा करने के लिए प्रतीक्षा करने के लिए प्रक्रिया संभाल पर WaitForSingleObject का उपयोग करना होगा। CreateProcess के अंतिम पैरामीटर में प्रक्रिया संभाल करने वाली जानकारी को संसाधित करने के लिए एक सूचक होना चाहिए। (मान लें कि CreateProcess सफल था) आपको आदेश को पूरा करने के लिए इंतजार करना होगा। एक बार यह पूरा होने के बाद, आप रिटर्न वैल्यू प्राप्त करने के लिए प्रक्रिया हैंडल का उपयोग कर सकते हैं, हालांकि मुझे इस बात पर आपको यह बताने के लिए बहुत समय लगता है कि इस बिंदु पर इसे कैसे किया जाए।

+0

आपके उत्तर के लिए धन्यवाद, मैं कंसोल विंडो को छिपाने के बारे में और अधिक प्यार करूंगा, यह बहुत ही अच्छा होगा। – Samuel

6

आमतौर पर, आप किसी अन्य प्रोग्राम कॉल करने के लिए जा रहे हैं, लेकिन यह std::system की तरह काम नहीं करना चाहते हैं, तो आप fork()/विंडोज पर यूनिक्स पर exec() या CreateProcess() की तरह एक प्लेटफ़ॉर्म-विशिष्ट समारोह की जरूरत जा रहे हैं। इन कार्यों दे आप उदाहरण के लिए, कैसे अन्य कार्यक्रम चलाता है पर नियंत्रण है कि यह उत्पादन नहीं दिखा सकते हैं या नहीं एक कंसोल विंडो बनाने के लिए, आदि

2

जब आप Windows के लिए खत्म हो और CreateProcess() फोन, सेट करना सुनिश्चित करें:

lpStartupInfo->wShowWindow = SW_HIDE; 

यह सुनिश्चित करेगा कि नई प्रक्रिया द्वारा बनाई गई कोई भी विंडो छिपी हुई है।

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

+0

lpStartupInfo के अंतर्गत कौन सी लाइब्रेरी है? – Samuel

+0

हाय सैमुअल।lpStartupInfo CreateProcess() फ़ंक्शन के लिए दूसरा-से-अंतिम पैरामीटर है। विवरण के लिए कृपया फ़ंक्शन के दस्तावेज़ों से परामर्श लें (मेरे मूल पोस्ट में लिंक देखें)। – CoreTech

2

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

#include <Windows.h> 

फिर एक पिंग कमांड भेजें और आउटपुट को इस तरह की फाइल में लिखें;

WinExec("ping google.com > file.dat", SW_HIDE); 

यह google.com से एक पिंग कमांड भेजने के लिए और अपने वर्तमान चल रहे प्रोग्राम की निर्देशिका में फ़ाइल 'file.dat' के लिए उत्पादन लिखते होगा। तो आप file.dat को किसी भी फ़ाइल या फ़ाइलपैथ में बदल सकते हैं और निश्चित रूप से आप पिंग कमांड बदल सकते हैं। > चरित्र का अर्थ है कि कमांड के आउटपुट को इसके पीछे फ़ाइल पथ में लिखा जाना चाहिए। यदि आप कंसोल विंडो दिखाना चाहते हैं और पिंग कमांड चलाते समय एप्लिकेशन को फ्रीज करना चाहते हैं तो आपको WindExec() कोड के बजाय कोड की निम्न पंक्ति का उपयोग करने की आवश्यकता है;

system("ping google.com > file.dat");