बेंचमार्किंग प्रयोजनों के लिए एक या कई दूरस्थ सर्वरों के लिए टीसीपी ट्रैफ़िक की नकल कैसे करें?


30

इन्फ्रास्ट्रक्चर: सर्वर इन डाटासेंटर, ओएस - डेबियन स्क्वीज़, वेबसर्वर - अपाचे 2.2.16


परिस्थिति:

लाइव सर्वर हर दिन हमारे क्यूसेमर्स द्वारा उपयोग में है, जो समायोजन और सुधार का परीक्षण करना असंभव बनाता है। इसलिए हम लाइव सर्वर पर इनबाउंड HTTP ट्रैफ़िक को वास्तविक समय में एक या कई रिमोट सर्वर पर डुप्लिकेट करना चाहते हैं। ट्रैफ़िक को स्थानीय वेबसर्वर (इस मामले में अपाचे) और दूरस्थ सर्वर (ओं) को पास करना होगा। जिससे हम कॉन्फ़िगरेशन को समायोजित कर सकते हैं और बेंचमार्किंग के लिए दूरस्थ सर्वर (एस) पर विभिन्न / अपडेटेड कोड का उपयोग कर सकते हैं और वर्तमान लाइव सर्वर के साथ तुलना कर सकते हैं। वर्तमान में वेबसर्वर लगभग सुन रहा है। क्लाइंट संरचना की वजह से 60 और 443 के अलावा 60 अतिरिक्त पोर्ट।


प्रश्न: एक या कई दूरस्थ सर्वरों के लिए यह दोहराव कैसे लागू किया जा सकता है?

हमने पहले ही प्रयास किया है:

  • agnoster अनुलिपित्र - इसके लिए प्रति पोर्ट एक खुले सत्र की आवश्यकता होगी जो लागू नहीं है। ( https://github.com/agnoster/duplicator )
  • kklis प्रॉक्सी - केवल दूरस्थ सर्वर के लिए ट्रैफ़िक को अग्रेषित करता है, लेकिन इसे lcoal वेबसर्वर के पास नहीं भेजता है। ( https://github.com/kklis/proxy )
  • iptables - DNAT केवल ट्रैफ़िक को अग्रेषित करता है, लेकिन इसे स्थानीय वेबसर्वर के पास नहीं भेजता है
  • iptables - TEE केवल स्थानीय नेटवर्क में सर्वरों की नक़ल करता है -> डेटाटेंटर की संरचना के कारण सर्वर एक ही नेटवर्क में स्थित नहीं हैं
  • स्टैकओवरफ़्लो ( /programming/7247668/duplicate-tcp-traffic-with-a-proxy ) पर प्रश्न "डुप्लीकेट टीसीपी ट्रैफ़िक विद अ प्रॉक्सी" के लिए दिए गए विकल्पों का सुझाव असफल रहा। जैसा कि उल्लेख किया गया है, टीईई स्थानीय नेटवर्क के बाहर दूरस्थ सर्वर के साथ काम नहीं करता है। टेप्रॉक्सी अब उपलब्ध नहीं है ( https://github.com/chrislusf/tee-proxy ) और हम इसे कहीं और नहीं ढूंढ सकते।
  • हमने एक दूसरा आईपी पता (जो उसी नेटवर्क में है) को जोड़ा है और इसे eth0: 0 (प्राथमिक आईपी एड्रेस को eth0 को दिया है) को सौंपा है। इस नए आईपी या वर्चुअल इंटरफ़ेस eth0: 0 को iptables TEE फ़ंक्शन या मार्गों के साथ संयोजित करने में कोई सफलता नहीं।
  • "डेबियन निचोड़ पर डुप्लिकेट इनकमिंग टीसीपी ट्रैफ़िक" (डेबियन स्क्वीज़ पर डुप्लिकेट इनकमिंग टीसीपी ट्रैफ़िक ) प्रश्न के लिए प्रदान किए गए विकल्प असफल थे। बिल्ली | एनसी सत्र (बिल्ली / tmp / prodpipe | nc 127.0.0.1 12345 और cat / tmp / testpipe | nc 127.0.0.1 23456) प्रत्येक अनुरोध के बाद बाधित होते हैं / बिना किसी नोटिस या लॉग के किसी ग्राहक से जुड़ते हैं। रखवाले ने इस स्थिति को नहीं बदला। टीसीपी संकुल को दूरस्थ प्रणाली में नहीं पहुंचाया गया था।
  • Socat के विभिन्न विकल्पों के साथ साथ अतिरिक्त कोशिश करता (HowTo: http://www.cyberciti.biz/faq/linux-unix-tcp-port-forwarding/ , /programming/9024227/duplicate-input- यूनिक्स-स्ट्रीम-टू-मल्टिपल-टीसीपी-क्लाइंट्स-यूजिंग-सोसाइटी ) और इसी तरह के उपकरण असफल थे, क्योंकि प्रदान किए गए टीईई फ़ंक्शन केवल एफएस को लिखेंगे।
  • बेशक, गुगली करना और इस "समस्या" या सेटअप की खोज करना असफल रहा।

हम यहां विकल्पों से भाग रहे हैं।

क्या IPTABLES का उपयोग करते समय TEE फ़ंक्शन के "स्थानीय नेटवर्क में सर्वर" के प्रवर्तन को अक्षम करने की कोई विधि है?

क्या IPTABLES या रूट के विभिन्न उपयोग से हमारा लक्ष्य प्राप्त किया जा सकता है?

क्या आप इस उद्देश्य के लिए एक अलग उपकरण जानते हैं जो इन विशिष्ट परिस्थितियों के लिए परीक्षण और काम करता है?

क्या टी-प्रॉक्सी के लिए एक अलग स्रोत है (जो हमारी आवश्यकताओं को पूरी तरह से फिट करेगा, एएफएआईके)?


आपके उत्तरों के लिए अग्रिम धन्यवाद।

----------

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

यहाँ अजगर लिपि है, जो हमारी ज़रूरत के अनुसार काम करेगी:

import socket  
import SimpleHTTPServer  
import SocketServer  
import sys, thread, time  

def main(config, errorlog):
    sys.stderr = file(errorlog, 'a')

    for settings in parse(config):
        thread.start_new_thread(server, settings)

    while True:
        time.sleep(60)

def parse(configline):
    settings = list()
    for line in file(configline):
        parts = line.split()
        settings.append((int(parts[0]), int(parts[1]), parts[2], int(parts[3])))
    return settings

def server(*settings):
    try:
        dock_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        dock_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

        dock_socket.bind(('', settings[0]))

        dock_socket.listen(5)

        while True:
            client_socket = dock_socket.accept()[0]

            client_data = client_socket.recv(1024)
            sys.stderr.write("[OK] Data received:\n %s \n" % client_data)

            print "Forward data to local port: %s" % (settings[1])
            local_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            local_socket.connect(('', settings[1]))
            local_socket.sendall(client_data)

            print "Get response from local socket"
            client_response = local_socket.recv(1024)
            local_socket.close()

            print "Send response to client"
            client_socket.sendall(client_response)
            print "Close client socket"
            client_socket.close()

            print "Forward data to remote server: %s:%s" % (settings[2],settings[3])
            remote_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            remote_socket.connect((settings[2], settings[3]))
            remote_socket.sendall(client_data)       

            print "Close remote sockets"
            remote_socket.close()
    except:
        print "[ERROR]: ",
        print sys.exc_info()
        raise

if __name__ == '__main__':
    main('multiforwarder.config', 'error.log')

इस स्क्रिप्ट का उपयोग करने के लिए टिप्पणियां:
यह स्क्रिप्ट किसी अन्य स्थानीय और दूरस्थ सॉकेट सर्वर पर कॉन्फ़िगर किए गए स्थानीय पोर्ट की एक संख्या को अग्रेषित करती है।

कॉन्फ़िगरेशन:
कॉन्फ़िगरेशन फ़ाइल पोर्ट-फारवर्ड में जोड़ें। इस प्रकार की सामग्री के साथ लाइनों को कॉन्फ़िगर करें:

त्रुटि संदेश फ़ाइल में जमा हो जाते हैं 'error.log'।

स्क्रिप्ट कॉन्फ़िगर फ़ाइल के मापदंडों को
विभाजित करती है : प्रत्येक कॉन्फ़िग-लाइन को स्पेस के साथ विभाजित करें
0: स्थानीय पोर्ट को
1 सुनने के लिए : स्थानीय पोर्ट
2 पर फॉरवर्ड करने के लिए : रिमोट आईपी डेस्टिनेशन ऑफ़ सर्वर
3: डेस्टिनेशन पोर्ट ऑफ़ डेस्टिनेशन सर्वर
और रिटर्न सेटिंग्स


क्या सभी ट्रैफ़िक HTTP है?
लॉन्गनेक

हाँ, सभी ट्रैफ़िक HTTP है।
sise

1
btw। टेप्रॉक्सी यहाँ उपलब्ध है: github.com/chrislusf/teeproxy
टॉम्बर्ट

1
एक अन्य संभावना: github.com/ebowman/splitter Scala / Netty- आधारित।
रिच के।

जवाबों:


11

यह असंभव है। टीसीपी स्टेटफुल प्रोटोकॉल है। उपयोगकर्ता अंत कंप्यूटर कनेक्शन के हर चरण में शामिल है और यह कभी भी दो अलग-अलग सर्वरों को इसका जवाब देने की कोशिश नहीं करेगा। आप केवल वेबसर्वर या कुछ प्रॉक्सी पर सभी HTTP अनुरोध एकत्र कर सकते हैं और उन्हें फिर से कर सकते हैं। लेकिन यह एक जीवित सर्वर की संगामिति या यातायात की स्थिति नहीं देगा।


टीसीपी की नकल करना असंभव है - मैं इससे सहमत हूँ। परत 7 ट्रैफ़िक को डुप्लिकेट करना नहीं है। आप क्लाइंट से अनुरोधों को पकड़ सकते हैं और उन्हें अन्य सर्वर पर वापस खेल सकते हैं। टीसीपी सत्र प्लेबैक के लिए सरल 1 अनुरोध बहुत आसान होना चाहिए। लगातार कनेक्शन के लिए कुछ विचार करने की आवश्यकता होती है जैसे कि आप ग्राहक के अतिरिक्त अनुरोधों को कैसे पूरा करते हैं।
इवान एंडरसन

@ काजीमिरस एल्युलिस: दो अलग-अलग सर्वरों के साथ संचार करना आवश्यक नहीं है। क्लाइंट प्राथमिक सर्वर = लाइव सर्वर के साथ संचार कर रहा है। लाइव सर्वर क्लाइंट अनुरोधों को प्रोसेस कर रहा है और क्लाइंट को जवाब दे रहा है। क्लाइंट के प्रसंस्करण और उत्तर देने के अलावा, प्राथमिक सर्वर दूसरे सर्वर = परीक्षण सर्वर के अनुरोधों की नकल कर रहा है। दूसरे सर्वर से प्राथमिक सर्वर पर प्रतिक्रियाओं को छोड़ दिया जाएगा / प्राथमिक सर्वर पर नजरअंदाज कर दिया जाएगा और ग्राहक को अग्रेषित नहीं किया जाएगा।
sise

@ इवान एंडरसन: HTTP स्तर पर दोहराव हमारे पहले विचार के रूप में अच्छी तरह से था, लेकिन उदासीनता प्रॉक्सी या इसी तरह के उपकरण या मॉड्यूल एक साथ स्थानीय रूप से अनुरोधों को संसाधित करने और दूरस्थ होस्ट के लिए इसे डुप्लिकेट करने की अनुमति नहीं देते हैं। यदि आपके पास कोई अन्य विचार है, तो कृपया सलाह दें! :) हम रिकॉर्डिंग पर दोहराव पसंद कर रहे हैं और तुरंत तुलना परिणाम प्राप्त करने के लिए फिर से खेलना कर रहे हैं।
sise

1
@ उठाएं: आप अपने स्वयं के http प्रॉक्सी को लिखने की कोशिश कर सकते हैं, जो दो सर्वरों के लिए ट्रैफ़िक पास करता है। पायथन ट्विस्टेड फ्रेमवर्क twistedmatrix.com के साथ करना बहुत आसान होना चाहिए ।
काजीमीरास एल्युलिस

@ काजीमिरस एलियुलिस: यह निश्चित रूप से एक विकल्प है! मैंने इसके बारे में कभी नहीं सुना। लेकिन इसकी जाँच से पता चलता है कि यह हमारे उद्देश्य के लिए पूरी तरह से फिट होगा। हम पहले अजगर पर विचार नहीं करते थे, लेकिन वर्तमान में हम सामान्य अजगर के साथ ट्विस्टेड ढांचे और संभावनाओं को देख रहे हैं। हम सफल होने पर वापस रिपोर्ट करेंगे!
sise

20

आप जो वर्णन करते हैं, उसमें से GOR आपकी आवश्यकताओं के अनुरूप लगता है। https://github.com/buger/gor/ "वास्तविक समय में HTTP ट्रैफ़िक फिर से खेलना। उत्पादन से मंचन और देव प्रकाशनों के लिए ट्रैफ़िक फिर से खेलना।" ?


2
यह वही है जो मैं ढूंढ रहा था, बहुत बहुत धन्यवाद, आपने मुझे यह लिखने में बिल्कुल बचा लिया, गो में! :-)

nginx में मिरर मॉड्यूल है। nginx.org/en/docs/http/ngx_http_mirror_module.html
जिमी एमजी लिम

7

टेपरॉक्सी का उपयोग यातायात को दोहराने के लिए किया जा सकता है। उपयोग वास्तव में सरल है:

./teeproxy -l :80 -a localhost:9000 -b localhost:9001
  • a उत्पादन सर्वर
  • b परीक्षण सर्वर

जब आप roundrobinअपने वेबसर्वर से पहले HAproxy (के साथ ) डालते हैं तो आप अपने ट्रैफ़िक के 50% को आसानी से परीक्षण स्थल पर भेज सकते हैं:

         /------------------> production
HAproxy /                 ^
        \                /
         \---- teeproxy -.....> test (responses ignored)

4

टीसीपी, एक स्टेटफुल प्रोटोकॉल होने के नाते, किसी अन्य होस्ट पर केवल पैकेट की प्रतियां नष्ट करने के लिए उत्तरदायी नहीं है, जैसा कि @KazimierasAliulis बताते हैं।

टीसीपी समाप्ति की परत पर पैकेट उठाकर उन्हें एक नई टीसीपी स्ट्रीम के रूप में रिले करना उचित है। अनुलिपित्र उपकरण आप दिखता से जुड़ा हुआ आपका सर्वश्रेष्ठ दांव की तरह। यह टीसीपी प्रॉक्सी के रूप में संचालित होता है, जिससे टीसीपी राज्य मशीन को ठीक से संचालित करने की अनुमति मिलती है। आपकी परीक्षण मशीनों की प्रतिक्रियाओं को छोड़ दिया जाएगा। ऐसा लगता है कि यह बिल ठीक है जो आप चाहते हैं के लिए फिट बैठता है।

यह मेरे लिए अस्पष्ट है कि आपने अनुलिपित्र टूल को अस्वीकार्य क्यों लिखा है। आपको टूल के कई उदाहरण चलाने होंगे क्योंकि यह केवल एक ही पोर्ट पर सुनता है लेकिन, संभवतः, आप बैक-एंड सिस्टम पर अलग-अलग पोर्ट के लिए अलग-अलग सुनने वाले पोर्ट्स में से प्रत्येक को रिले करना चाहते हैं। यदि नहीं, तो आप iptables DNAT का उपयोग डुप्लीकेट टूल की एकल श्रवण प्रति को सुनने के सभी पोर्ट को निर्देशित करने के लिए कर सकते हैं।

जब तक आपके द्वारा परीक्षण किए जा रहे एप्लिकेशन सरल नहीं होते, मुझे उम्मीद है कि आपको समय और आंतरिक अनुप्रयोग स्थिति से संबंधित इस परीक्षण पद्धति के साथ समस्याएं होने वाली हैं। आप भ्रामक रूप से सरल ध्वनियां करना चाहते हैं - मुझे उम्मीद है कि आप बहुत सारे किनारे वाले मामलों को खोजने जा रहे हैं।


हां, आप पूरी तरह से सही हैं, एग्नॉस्टर डुप्लिकेट टूल मल्टी पोर्ट स्थिति को छोड़कर हमारी आवश्यकताओं को पूरा करेगा। इसके अलावा परीक्षण मशीन की प्रतिक्रियाओं का त्याग पूर्ण है। वास्तविक / सजीव स्थिति का सटीक रूप से यथासंभव अनुकरण करने के अपने लक्ष्य को प्राप्त करने के लिए हम लाइव सर्वर पर सभी पोर्ट को परीक्षण मशीन पर एक एकल पोर्ट से बंडल नहीं कर सकते। क्लाइंट डिवाइस को अलग-अलग ग्राहकों में विभाजित करने के लिए विभिन्न पोर्ट का उपयोग किया जाता है। जिससे हमें इस डुप्लिकेट टूल के 60-70 सेशन खोलने होंगे। यह बहुत व्यावहारिक नहीं है क्योंकि आप कल्पना कर सकते हैं।
०३

@Sise - थकाऊ काम करने में कंप्यूटर अच्छे हैं। मुझे लगता है कि आप अपने अपाचे कॉन्फ़िगरेशन को पार्स करने के लिए एक स्क्रिप्ट लिख सकते हैं और डुप्लिकेट टूल के 60 - 70 उदाहरणों को चलाने के लिए आवश्यक कमांड लाइनों को थूक सकते हैं। मैं कल्पना नहीं कर सकता कि अनुलिपित्र उपकरण बहुत संसाधन गहन है, लेकिन अगर ऐसा था, तो आप उन 60 - 70 उदाहरणों को किसी अन्य मशीन पर चला सकते हैं और वहां पर यातायात प्राप्त करने के लिए कुछ नेटवर्क चालबाजी कर सकते हैं। मेरे लिए, कम से कम, जो पूरी तरह से व्यावहारिक है और इसे संभालने के लिए एक बहुत ही सरल तरीका है।
इवान एंडरसन

1

मैं कुछ ऐसा ही करने की कोशिश कर रहा हूं, हालांकि, अगर आप बस एक सर्वर पर लोड का अनुकरण करने की कोशिश कर रहे हैं तो मैं लोड-टेस्टिंग फ्रेमवर्क की तरह कुछ देखूंगा। मैंने अतीत में locust.io का उपयोग किया है और यह एक सर्वर पर लोड का अनुकरण करने के लिए वास्तव में अच्छी तरह से काम करता है। आपको बड़ी संख्या में ग्राहकों को अनुकरण करने की अनुमति देनी चाहिए और आपको किसी अन्य सर्वर पर यातायात अग्रेषित करने की दर्दनाक प्रक्रिया से गुजरने के बिना सर्वर के कॉन्फ़िगरेशन के साथ खेलने देना चाहिए।


0

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

सिस्को कैटेलिस्ट स्विच के मामले में, इसे स्पैन (अधिक जानकारी यहाँ ) कहा जाता है । एक सिस्को वातावरण में आप एक अलग स्विच पर प्रतिबिंबित पोर्ट भी रख सकते हैं।

लेकिन इसका उद्देश्य यातायात-विश्लेषण के लिए है, इसलिए यह पहले दिशा में ऊपर दिए गए पाठ में इन-डायरेक्शनल - कीवर्ड होगा: इनबाउंड । मुझे नहीं लगता कि पोर्ट किसी भी वापसी यातायात की अनुमति देगा, और अगर यह किया, तो आप डुप्लिकेट वापसी ट्रैफ़िक से कैसे निपटेंगे? यह शायद सिर्फ अपने नेटवर्क के साथ कहर बरपाएगा।

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


हमने उस बारे में सोचा है, मैंने स्पैन के उपयोग के विकल्प के बारे में पढ़ा है। लेकिन, क्योंकि सर्वर थर्ड पार्टी प्रोवाइडर के डेटा सेंटर में स्थित होते हैं, हार्डवेयर परिवर्तन की बात करने पर हमारे पास सीमित संभावनाएँ होती हैं। मैंने पहले ही एक दूसरे निक पर 2 सर्वरों को सीधे कनेक्ट करने का अनुरोध किया है। यह कार्रवाई सिर्फ इन 2 सर्वरों के लिए एक स्थानीय नेटवर्क के साथ मिलकर मुझे TET के साथ IPTABLES का उपयोग करने की अनुमति देगी। लेकिन इस विकल्प के लिए जाने के लिए हमें सर्वरों के बाहरी आईपी को बदलने की आवश्यकता होगी, जो कि एक NoGo है क्योंकि क्लाइंट डिवाइसों को सेट IP से कनेक्ट करने के लिए कॉन्फ़िगर किया गया है।
सीज़ करें

0

मैंने Node.js के साथ एक समान उद्देश्य के लिए एक रिवर्स प्रॉक्सी / लोड बैलेंसर भी लिखा है (यह केवल मनोरंजन के लिए है, फिलहाल उत्पादन तैयार नहीं है)।

https://github.com/losnir/ampel

यह बहुत राय है, और वर्तमान में समर्थन करता है:

  • GET राउंड-रॉबिन चयन का उपयोग करना (1: 1)
  • POSTअनुरोध विभाजन का उपयोग करना। "मास्टर" और "छाया" की कोई अवधारणा नहीं है - पहला बैकएंड जो प्रतिक्रिया देता है वह है जो क्लाइंट अनुरोध की सेवा करेगा, और फिर अन्य सभी प्रतिक्रियाओं को छोड़ दिया जाएगा।

अगर कोई इसे उपयोगी पाता है तो मैं इसे और अधिक लचीला बनाने के लिए सुधार कर सकता हूं।


Node.js इस तरह के एक आवेदन के लिए भाषा का एक बहुत ही अजीब विकल्प है जो बहुत उच्च प्रदर्शन की आवश्यकता है। मुझे यकीन नहीं है कि यह कभी भी तैयार होगा।
माइकल हैम्पटन

तुम पूरी तरह ठीक हो। यह अत्यधिक प्रदर्शन करने के लिए नहीं था - सिर्फ लिखने के लिए आसान (मेरे लिए)। मुझे लगता है कि यह आवश्यक भार पर निर्भर करता है। हालांकि मैं एक कम अंत मशीन पर 1,000rps से थोड़ा अधिक हासिल करने में सक्षम था (2 कोर)।
लॉसनियर

0

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

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

https://github.com/mkevac/goduplicator


-1

एक चीनी कंपनी के एक आदमी द्वारा बनाया गया एक उपकरण है, और शायद यह वही है जो आपको चाहिए: https://github.com/session-replay-tools/tcpcopy


2
हाय और serverfault में आपका स्वागत है। क्या आप अधिक विस्तृत उत्तर प्रदान कर सकते हैं? कार्यक्रम वास्तव में क्या करता है? क्या इसे C में लिखा गया है ...?
bgtvfr
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.