मैक टर्मिनल में यूनिक्स निष्पादन योग्य के लिए तर्क पास करें


0

मैं यूनिक्स कोडिंग के लिए बहुत नया हूं और कुछ सरल नेटवर्किंग परियोजनाओं पर काम करना चाहूंगा। मुझे कुछ ट्यूटोरियल मिले जो कि मैं देख रहा हूँ - विशेष रूप से यह: http://www.linuxhowtos.org/C_C++/socket.htm

मुझे पता चला है कि कैसे सर्वर और क्लाइंट सी फ़ाइलों को निष्पादनयोग्य में संकलित किया जाए, और मैं उन्हें टर्मिनल में इस तरह से चला सकता हूं:

open server
open client

जब से मैं मैक ओएस एक्स 10.7.5 का उपयोग कर रहा हूं। मेरी समस्या यह है कि जब मैं उन्हें प्रारंभ करता हूं तो मुझे इन कार्यक्रमों के लिए तर्क पारित करने की आवश्यकता होती है। ट्यूटोरियल इस कोड का उपयोग करता है:

server 51717
client clientName 51717

लेकिन मुझे अपने मैक टर्मिनल में इसे दोहराने का कोई तरीका नहीं मिला।

open server --args 51717 //doesn't work

मैंने इस पोस्ट को ढूंढा और इस कोड के साथ एक एप्सस्क्रिप्ट बनाया

do shell script "open -a /Desktop/server --args 51717"

लेकिन वह त्रुटियों का एक गुच्छा फेंकता है। मैंने कई बदलावों की कोशिश की, लेकिन चलाने के लिए कोई भी नहीं मिला। मुझे उस पोस्ट से काम करने का क्रोम उदाहरण भी नहीं मिला (मेरे पास एफएफ स्थापित नहीं है)।

मैं ट्यूटोरियल में प्रोग्राम के तर्क के रूप में एक साधारण पूर्णांक पोर्ट नंबर कैसे पास कर सकता हूं? क्या लिनक्स मशीन पर ऐसा करना आसान है? मुझे इस समय OS को स्विच करने में कोई समस्या नहीं है, और यह आदर्श होगा यदि मैं 'सर्वर 51717' सिंटैक्स का उपयोग कर सकता हूं जो कि ट्यूटोरियल प्रत्येक प्रोग्राम के लिए एक अलग रन स्क्रिप्ट बनाने के बजाय उपयोग करता है। एक जवाब और सलाह की तलाश में। धन्यवाद।

संपादित करें:

मैंने इसे सही तरीके से चलाने के लिए प्राप्त किया है, लेकिन अभी भी काम नहीं कर रहा है। मैं इस तरह से सर्वर शुरू करता हूं:

$ ./server 3456

फिर एक नया टर्मिनल खोलें और क्लाइंट को सीमित सफलता के साथ शुरू करें:

$ ./client mClient 3456
ERROR, no such host
$ ./client 127.0.0.1 3456
Please enter the message: //running correctly
//... this also works
$ ./client 127.1 3456
Please enter the message: //running correctly

मैं क्लाइंट को कुछ नंबर.नंबर संयोजन के साथ शुरू कर सकता हूं, लेकिन यह उन सभी के लिए काम नहीं करता है और मैं किसी भी पत्र का उपयोग नहीं कर सकता हूं। इनमें से केवल एक ही समाधान क्यों काम करता है?

उपाय:

$ sudo nano /private/etc/hosts

127.0.0.1 mClientनीचे जोड़ें और फिर सेव करने के लिए Ctrl ^ o दबाएं

अब यह काम करता है:

$ ./client mClient 3456

क्या आपको खुले का उपयोग करना है? क्या आप केवल बाइनरी को सीधे निष्पादित नहीं कर सकते हैं उदाहरण के लिए सीडी को इसके साथ और फिर ./server 51717 पर?
डेव सी

खुला उपयोग करने की ज़रूरत नहीं है, मुझे नहीं पता था कि मैं सीधे एक्सस कॉल कर सकता हूं (मैंने '$ सर्वर' की कोशिश की थी, लेकिन यह काम नहीं किया इसलिए मैंने मान लिया कि मुझे एक रन फ़ंक्शन की आवश्यकता है) .. मुझे अभी भी चलने में परेशानी हो रही है ग्राहक हालांकि - इसे होस्टनाम के रूप में स्ट्रिंग्स स्वीकार नहीं कर रहा है
Cbas

1
तो mClient क्या आपका होस्टनाम है? क्या आप इस पर डीएनएस लुकअप कर रहे हैं (मैं मान रहा हूं क्योंकि त्रुटि ऐसी कोई होस्ट नहीं है) जिस स्थिति में यह मौजूद है और आपके क्लाइंट के लिए काम करता है? क्या होता है अगर आप पिंग mClient?
डेव सी

यह मुद्दा था, मुझे नहीं पता था कि मुझे इसका उपयोग करने से पहले मेजबानों में उपनाम को परिभाषित करना होगा। धन्यवाद
Cbas

जवाबों:


1

कोड संकलित करें:

$ gcc client.c -o client
$ gcc server.c -o server

सर्वर को बिना तर्क के चलाएं:

$ ./server
ERROR, no port provided

सर्वर को एक तर्क से चलाएं:

$ ./server 3456

एक अलग टर्मिनल में:

$ ./client 3456
usage ./client hostname port  

एक उपयोग संदेश इंगित करता है कि बाइनरी को कैसे चलाया जाए, जो कि इसे देने के लिए तर्क है

$ ./client eee.lan 3456
Please enter the message:

चूंकि सर्वर सभी इंटरफेस पर सुन रहा है, आप भी उपयोग कर सकते हैं

$ ./client 127.0.0.1 3456
Please enter the message: Hello World!
I got your message

इसलिए तर्क तार हैं जो कमांड का पालन करते हैं। जीसीसी उदाहरण में 3 तर्क हैं:server.c -o server

कोड का प्रासंगिक हिस्सा (सर्वर) है:

portno = atoi(argv[1]);

argv वेक्टर (एरे) है जो कमांड प्रॉम्प्ट पर कमांड में दिए गए सभी तर्कों को रखता है। atoi एक स्ट्रिंग को पूर्णांक में परिवर्तित करता है।


होस्टनाम के रूप में एक आईपी पते का उपयोग करना एकमात्र ऐसी चीज है जो काम करने लगती है - उदाहरण के लिए मेरा संपादन देखें
Cbas

आपको काम करने के लिए कस्टम नामों के लिए एक वास्तविक DNS सर्वर या उपनाम / आदि / होस्ट सेट करना होगा। मैं शर्त लगाता हूं कि localhostयह भी काम करेगा क्योंकि यह 127.0.0.1 पर आधारित है, आपका स्थानीय आईपी पता भी (192.168.0.13 या ऐसा ही कुछ) करेगा।
урослав Рахматуллин

ओह, धन्यवाद अब यह समझ में आता है। मैंने होस्ट्स फ़ाइल में एक उपनाम जोड़ा और इसे काम करने के लिए मिला।
Cbas

1

बस बाइनरी को कंसोल से सीधे निष्पादित करें - मेरे मैकबुक (10.8.4) पर खुले का उपयोग करके "मनमाना" बायनेरिज़ को खुले से नहीं खोला जा सकता है (खुले का मतलब उपयुक्त एप्लिकेशन में फ़ाइल खोलने के लिए फ़ाइल डिस्क्रिप्टर का उपयोग करने के लिए है)।

उदाहरण के लिए यदि आपका सर्वर और क्लाइंट बायनेरिज़ डेस्कटॉप (~ / डेस्कटॉप) में हैं, तो उन्हें कंसोल से निष्पादित किया जा सकता है:

~/Desktop/server 51717
~/Desktop/client clientName 51717

या डेस्कटॉप निर्देशिका में स्थानीय रूप से:

cd ~/Desktop
./server 51717
./client clientName 51717

यह ठीक वैसा ही व्यवहार है जैसा कि आप लिनक्स (या किसी अन्य * ix सिस्टम) पर देखेंगे।

नोट फ़ाइलों को निष्पादन योग्य के रूप में चिह्नित करने की आवश्यकता होगी, लेकिन संकलक सामान्य रूप से आपके लिए ऐसा करेगा।

सौभाग्य!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.