मैं सी में एक टेलनेट सर्वर को कार्यान्वित करना चाहता हूं। मैं इसके साथ कैसे आगे बढ़ूंगा? मुझे कौन से आरएफसी देखना चाहिए? यह मेरे लिए महत्वपूर्ण है, और मैं किसी भी मदद की सराहना करता हूं।टेलनेट सर्वर
उत्तर
बहुत ही बुनियादी टेलनेट (केवल एक बंदरगाह के लिए टेलनेट और गूंज बाइट्स) के लिए, ऐसा करने के लिए बहुत कुछ नहीं है। एक सॉकेट से पढ़ें, इसे संसाधित करें (एक गूंज सर्वर में, कुछ भी नहीं करें), परिणाम को थूक दें। आप किसी भी आरएफसी में कुछ भी जानने के बिना एक साधारण एमयूडी-स्टाइल सर्वर को कार्यान्वित कर सकते हैं।
लेकिन यदि आप वास्तव में आरएफसी के बारे में चिंतित हैं, तो आरएफसी 854 एक शुरुआती बिंदु हो सकता है।
है बस बाइट्स को प्रतिबिंबित करना एक टेलनेट सर्वर से बहुत दूर है ... – bortzmeyer
सवाल ऐसा लगता है घर का पाठ। उन्हें एक जवाब मिला जो गृहकार्य के लिए उपयुक्त है। आप क्या जोड़ना चाहते थे? –
एनवीटी टर्मिनल का प्रबंधन, बचने के अनुक्रम, आदि – bortzmeyer
आप सॉकेट प्रोग्रामिंग के साथ मदद की जरूरत है आदि
चेकआउट बीज की गाइड: http://beej.us/guide/bgnet/
आप नेटवर्क प्रोग्रामिंग के बारे में गंभीर हैं, तो मैं अत्यधिक की सिफारिश करेंगे रिचर्ड डब्ल्यू स्टीवंस के "UNIX Network Programming Vol 1" - यह महान उदाहरणों के साथ आरएफसी की तुलना में काफी बेहतर है।
यह बहुत महंगा किताब है लेकिन eBay पर सस्ते पेपरबैक संस्करण उपलब्ध हैं। भले ही आपको महंगी हार्ड-कवर संस्करण मिल जाए, यह आपके द्वारा भुगतान किए गए हर पैसे के लायक है।
यह जानकर कि सॉकेट एपीआई आंतरिक रूप से कैसे काम करता है, यह बहुत उपयोगी है, क्योंकि इसे अक्सर उच्च स्तर की भाषाओं द्वारा बहुत मामूली परिवर्तनों के साथ निर्यात किया जाता है।
यह कहा गया है कि आप GLib द्वारा प्रदान किए गए ईवेंट लूप समर्थन का उपयोग करना चाहेंगे और संबंधित नेटवर्किंग लाइब्रेरी GNet का उपयोग करना चाहेंगे।
यहां पोर्ट 4000 पर सॉकेट खोलने के लिए जीनेट का उपयोग करने का तरीका बताया गया है, फिर इसके लिए किए गए प्रत्येक कनेक्शन को बंद करें। यहां जादू का एक छोटा सा हिस्सा है क्योंकि सर्वर अपने निर्माण के हिस्से के रूप में डिफ़ॉल्ट मुख्य संदर्भ के साथ खुद को पंजीकृत करता है।
#include <glib.h>
#include <gnet.h>
void client_connect(GServer G_GNUC_UNUSED *server, GConn *conn, gpointer G_GNUC_UNUSED user_data){
g_print("Connection from %s\n", conn->hostname);
gnet_conn_disconnect(conn);
gnet_conn_unref(conn); conn = NULL;
}
int main(void){
GMainLoop *loop = g_main_loop_new(NULL, FALSE);
GServer *server;
gnet_init();
server = gnet_server_new(NULL, 4000, client_connect, NULL);
g_main_loop_run(loop);
g_main_loop_unref(loop); loop = NULL;
return 0;
}
ध्यान दें कि वास्तविक टेलनेट नहीं सिर्फ एक सरल अंतरफलक है कि stdin
और उपयोगकर्ता के लॉगिन खोल के stdout
संभालती है।
वहां कई अतिरिक्त कार्यक्षमताएं हैं जो 'विकल्प' में अलग-अलग ले जाती हैं, जो $TERM
पर्यावरण चर को सेट करने, पंक्तियों/कॉलम को सेट करने (और उपयोगकर्ता को उनके टर्मिनल का आकार बदलने पर उन्हें रीसेट करने जैसी चीजों को संभालती है)।
यदि आप वास्तविक टेलनेट करना चाहते हैं, न केवल एक साधारण टीसीपी सर्वर, तो वास्तव में आरएफसी 854 आपका प्रारंभिक बिंदु है। लेकिन वहाँ के ढेर और अधिक प्रासंगिक RFC, जो उन विकल्पों जो कि ऊपर उल्लेख किया वर्णन http://en.wikipedia.org/wiki/Telnet
पर सूचीबद्ध होते हैं मैं Wireshark इंस्टॉल करने की अनुशंसा एक मौजूदा टेलनेट सर्वर का उपयोग कर टेलनेट यातायात को देखने के लिए है। फिर लॉग को देखते हुए, आप बेहतर समझ सकते हैं कि सर्वर क्लाइंट के साथ कैसे संचार करता है। फिर, आरएफसी को संदर्भ के रूप में उपयोग करें यदि आप तार में जाने वाले किसी भी आदेश को समझ नहीं पाते हैं।
यह बेहद खराब सलाह है। पहले आरएफसी पढ़ें और * फिर * वायरशर्क निशान देखें। – Alnitak
मज़ा के लिए, या होमवर्क असाइनमेंट के लिए? –
मैं नहीं कह सकता, लेकिन मुझे लगता है कि यह उनके लिए कम से कम महत्वपूर्ण है ... – PhirePhly
यदि यह व्यावहारिक उपयोग के लिए है, तो यह एक एसएसएच सर्वर होना चाहिए ... – bortzmeyer