Erlang 21

erl_connect




erlang

erl_connect

C लाइब्रेरी

erl_connect

लाइब्रेरी सारांश

वितरित एर्लांग के साथ संवाद करें।

विवरण

यह मॉड्यूल वितरित एरलांग नोड्स और सी-नोड्स के बीच संचार के लिए समर्थन प्रदान करता है, एक तरीके से जो एरलंग प्रक्रियाओं के लिए पारदर्शी है।

सी-नोड एक छिपे हुए नोड के रूप में एरलंग को दिखाई देता है। यही है, एरलैंग प्रक्रियाएं जो सी-नोड के नाम को जानती हैं, सामान्य तरीके से इसके साथ संवाद कर सकती हैं, लेकिन erlang:nodes/0 द्वारा प्रदान की गई सूची में नोड नाम दिखाई नहीं देता है।

निर्यात

int erl_accept(listensock, conp)

प्रकार

यह फ़ंक्शन क्लाइंट प्रक्रिया से कनेक्शन स्वीकार करने के लिए सर्वर प्रक्रिया द्वारा उपयोग किया जाता है।

  • listensock एक ओपन सॉकेट डिस्क्रिप्टर है जिस पर पहले listen() कहा गया है।
  • conp एक पॉइंटर है जो ErlConnect स्ट्रक्चर का वर्णन करता है, जो इस प्रकार है:
typedef struct {
  char ipadr[4];
  char nodename[MAXNODELEN];
} ErlConnect;

सफलता पर, कनेक्टिंग क्लाइंट के पते और नोड नाम के साथ conp भरा जाता है और एक फ़ाइल विवरणक वापस आ जाता है। असफल होने पर, ERL_ERROR को लौटा दिया जाता है और erl_errno को EIO सेट कर erl_errno जाता है।

int erl_close_connection(fd)

प्रकार

एक Erlang नोड के लिए एक खुला कनेक्शन बंद कर देता है।

Fd एक फाइल डिस्क्रिप्टर है erl_connect() या erl_xconnect() से प्राप्त किया जाता है।

सफलता पर 0 रिटर्न। यदि कॉल विफल हो जाती है, तो एक गैर-शून्य मान वापस आ जाता है, और त्रुटि का कारण उचित प्लेटफ़ॉर्म-निर्भर कॉल के साथ प्राप्त किया जा सकता है।

int erl_connect(node) int erl_xconnect(addr, alive)

प्रकार

एक इरलांग नोड से संबंध स्थापित करता है।

erl_xconnect() को दूरस्थ होस्ट के IP पते और निर्दिष्ट किए जाने वाले दूरस्थ नोड के उपनाम की आवश्यकता होती है। erl_connect() एक वैकल्पिक इंटरफ़ेस प्रदान करता है, और प्रदान किए गए नोड नाम से जानकारी निर्धारित करता है।

  • addr रिमोट होस्ट का 32-बिट IP पता है।
  • alive सुदूर नोड का उपनाम है।
  • node रिमोट नोड का नाम है।

सफलता पर एक खुला फ़ाइल विवरणक लौटाता है, अन्यथा एक नकारात्मक मूल्य। बाद के मामले में erl_errno में से एक के लिए सेट किया गया है:

EHOSTUNREACH
दूरस्थ होस्ट node अप्राप्य है।
ENOMEM
अधिक मेमोरी उपलब्ध नहीं है।
EIO
I / O त्रुटि।

इसके अलावा, socket (2) और connect (2) सिस्टम कॉल से erl_errno को erl_errno में प्रचारित किया जा सकता है।

उदाहरण:

#define NODE   "[email protected]"
#define ALIVE  "madonna"
#define IP_ADDR "150.236.14.75"

/*** Variant 1 ***/
erl_connect( NODE );

/*** Variant 2 ***/
struct in_addr addr;
addr = inet_addr(IP_ADDR);
erl_xconnect( &addr , ALIVE );

int erl_connect_init(number, cookie, creation) int erl_connect_xinit(host, alive, node, addr, cookie, creation)

प्रकार

erl_connect मॉड्यूल को प्रारंभ करता है। विशेष रूप से, इन कार्यों का उपयोग सी-नोड के नाम की पहचान करने के लिए किया जाता है, जहां से उन्हें बुलाया जाता है। erl_connect मॉड्यूल में किसी भी अन्य फ़ंक्शन का उपयोग करने से पहले इनमें से एक फ़ंक्शन को कॉल किया जाना चाहिए।

erl_connect_xinit() बारे में जानकारी के लिए बाद में उपयोग के लिए भंडार:

  • नोड का मेजबाननाम, host
  • जिंदाबाद, जिंदाबाद
  • नोड नाम, node
  • आईपी ​​पता, addr
  • कुकी, cookie
  • सृजन संख्या, creation

erl_connect_init() एक वैकल्पिक इंटरफ़ेस प्रदान करता है जिसे कॉल करने वाले से अधिक जानकारी की आवश्यकता नहीं होती है। इसके बजाय, डिफ़ॉल्ट मान प्राप्त करने के लिए erl_connect_init() gethostbyname() का उपयोग करता है।

यदि आप erl_connect_init() उपयोग करते हैं, तो आपके नोड में एक छोटा नाम होगा, अर्थात यह पूरी तरह से योग्य नहीं होगा। यदि आपको पूरी तरह से योग्य (लंबे) नामों का उपयोग करने की आवश्यकता है, तो इसके बजाय erl_connect_xinit() उपयोग करें।

  • host उस host का नाम है जिस पर नोड चल रहा है।

  • alive है नोड का उपनाम।

  • node नोड नाम है। यह फॉर्म alivename @ hostname का होना है

  • addr host का 32-बिट IP पता है।

  • cookie दूरस्थ नोड तक पहुँच के लिए आवश्यक प्राधिकरण स्ट्रिंग है। यदि NULL , उपयोगकर्ता HOME निर्देशिका को कुकी फ़ाइल .erlang.cookie लिए खोजा .erlang.cookie । होम निर्देशिका के लिए पथ को यूनिक्स पर पर्यावरण चर HOME से और विंडोज पर HOMEDRIVE और HOMEPATH चर से पुनर्प्राप्त किया गया है। अधिक जानकारी के लिए, कर्नेल में auth मॉड्यूल देखें।

  • creation सी-नोड के एक विशेष उदाहरण की पहचान करने में मदद करता है। विशेष रूप से, यह हमें उसी पंजीकृत नाम के साथ पूर्व प्रक्रिया में भेजे गए संदेशों को प्राप्त करने से रोकने में मदद कर सकता है।

सर्वर के रूप में कार्य करने वाला सी-नोड एक निर्माण संख्या निर्दिष्ट करता है जब वह erl_publish() कहता है।

number का उपयोग वास्तविक नोड नाम के निर्माण के लिए erl_connect_init() द्वारा किया जाता है। नीचे उदाहरण 2 में, "[email protected]" परिणामी नोड नाम है।

उदाहरण 1:

struct in_addr addr;
addr = inet_addr("150.236.14.75");
if (!erl_connect_xinit("chivas",
                       "madonna",
                       "[email protected]",
                       &addr;
                       "samplecookiestring..."),
                       0)
  erl_err_quit("<ERROR> when initializing !");

उदाहरण 2:

if (!erl_connect_init(17, "samplecookiestring...", 0))
  erl_err_quit("<ERROR> when initializing !");

int erl_publish(port)

प्रकार

इस फ़ंक्शन का उपयोग स्थानीय नाम सर्वर EPMD के साथ पंजीकरण करने के लिए एक सर्वर प्रक्रिया द्वारा किया जाता है, जिससे अन्य प्रक्रियाएं पंजीकृत नाम का उपयोग करके संदेश भेजने की अनुमति देती हैं। इस फ़ंक्शन को कॉल करने से पहले, प्रक्रिया को एक खुले सॉकेट पर bind() और listen() होना चाहिए।

port रजिस्टर करने के लिए स्थानीय नाम है, और पोर्ट नंबर के समान है जो पहले सॉकेट के लिए बाध्य था।

ईपीएमडी के साथ अपंजीकृत करने के लिए, बस लौटे विवरणक को बंद करें।

सफलता पर, कॉल करने की प्रक्रिया को EPMD से जोड़ने वाला एक डिस्क्रिप्टर वापस कर दिया जाता है। असफल होने पर, -1 लौटा दिया जाता है और erl_errno लिए सेट किया जाता है:

EIO
I / O त्रुटि।

इसके अलावा, socket (2) और connect (2) सिस्टम कॉल से erl_errno को erl_errno में प्रचारित किया जा सकता है।

int erl_receive(fd, bufp, bufsize)

प्रकार

एरलांग बाहरी प्रारूप में बाइट्स के अनुक्रम से मिलकर एक संदेश प्राप्त करता है।

  • fd एक इरलंग कनेक्शन का एक खुला विवरणक है।
  • bufp एक बफर है जो अपेक्षित संदेश को रखने के लिए पर्याप्त है।
  • bufsize के आकार को इंगित करता है।

यदि एक टिक होता है, ERL_TICK , कनेक्शन के दूसरे छोर पर ERL_TICK नोड ने इस नोड को यह देखने के लिए ERL_TICK किया है कि क्या यह अभी भी जीवित है, तो फ़ंक्शन ERL_TICK देता है और कोई संदेश बफर में नहीं रखा जाता है। इसके अलावा, erl_errno पर सेट है।

सफलता पर, संदेश को निर्दिष्ट बफ़र में रखा गया है और फ़ंक्शन वास्तव में पढ़े जाने वाले बाइट्स की संख्या लौटाता है। विफलता पर, फ़ंक्शन एक नकारात्मक मान लौटाता है और erl_errno को इनमें से एक में सेट करता है:

EAGAIN
अस्थायी त्रुटि: पुन: प्रयास करें।
EMSGSIZE
बफर बहुत छोटा है।
EIO
I / O त्रुटि।

int erl_receive_msg(fd, bufp, bufsize, emsg)

प्रकार

निर्दिष्ट बफ़र में संदेश प्राप्त करता है और (ErlMessage *) emsg में डीकोड (ErlMessage *) emsg

  • fd एक इरलंग कनेक्शन का एक खुला विवरणक है।
  • bufp एक बफर है जो अपेक्षित संदेश को रखने के लिए पर्याप्त है।
  • bufsize के आकार को इंगित करता है।
  • > emsg एक ErlMessage संरचना का एक संकेतक है जिसमें संदेश को डिकोड किया जाएगा। ErlMessage को निम्नानुसार परिभाषित किया गया है:
typedef struct {
  int type;
  ETERM *msg;
  ETERM *to;
  ETERM *from;
  char to_name[MAXREGLEN];
} ErlMessage;
ध्यान दें

ErlMessage की परिभाषा ErlMessage पुराने संस्करणों के बाद से बदल Erl_Interface

type संदेश की पहचान करता है, निम्न में से एक:

ERL_SEND

प्राप्तकर्ता का पिड समाहित emsg->to एक साधारण भेजने का ऑपरेशन हुआ और emsg->to । संदेश emsg->msg

ERL_REG_SEND

एक रजिस्टर्ड सेंड ऑपरेशन हुआ है और emsg->from के पिड में emsg->from । संदेश emsg->msg

ERL_LINK या ERL_UNLINK

emsg->to emsg->from प्रेषक और लिंक के प्राप्तकर्ता के लिंक या अनलिंक करें। emsg->msg का उपयोग नहीं किया जाता है।

ERL_EXIT

एक लिंक टूट गया है। emsg->to emsg->from जुड़ी प्रक्रियाओं के pids होते हैं, और emsg->msg में निकास का कारण होता है।

ध्यान दें

यह कॉल करने वाले की ज़िम्मेदारी है कि emsg->msg , emsg->to , और emsg->from द्वारा emsg->msg गई मेमोरी को जारी करे।

यदि एक टिक होता है, अर्थात, कनेक्शन के दूसरे छोर पर मौजूद ERL_TICK नोड ने इस नोड को यह देखने के लिए ERL_TICK है कि क्या यह अभी भी जीवित है, तो फ़ंक्शन यह दर्शाता है कि ERL_TICK यह दर्शाता है कि टिक प्राप्त हो गया है और इसका जवाब दिया गया है, लेकिन कोई संदेश नहीं रखा गया है बफर में। इस स्थिति में आपको erl_receive_msg() फिर से कॉल करना है।

सफलता मिलने पर, फ़ंक्शन ERL_MSG लौटाता है और Emsg संरचना को ऊपर वर्णित के अनुसार प्रारंभ किया जाता है, या ERL_TICK , जिस स्थिति में कोई संदेश वापस नहीं आता है। विफलता पर, फ़ंक्शन ERL_ERROR लौटाता है और erl_errno को इनमें से एक में सेट करता है:

EMSGSIZE
बफर बहुत छोटा है।
ENOMEM
अधिक मेमोरी उपलब्ध नहीं है।
EIO
I / O त्रुटि।

int erl_reg_send(fd, to, msg)

प्रकार

एक पंजीकृत प्रक्रिया के लिए एक इरलांग शब्द भेजता है।

  • fd एक इरलंग कनेक्शन का एक खुला विवरणक है।
  • एक स्ट्रिंग है जिसमें संदेश के इच्छित प्राप्तकर्ता का पंजीकृत नाम है।
  • msg भेजने के लिए शब्द Erlang है।

सफलता पर 1 रिटर्न, अन्यथा 0 । बाद के मामले में erl_errno में से एक के लिए सेट किया गया है:

ENOMEM
अधिक मेमोरी उपलब्ध नहीं है।
EIO
I / O त्रुटि।

ETERM *erl_rpc(fd, mod, fun, args) int erl_rpc_from(fd, timeout, emsg) int erl_rpc_to(fd, mod, fun, args)

प्रकार

दूरस्थ नोड पर एरलांग फ़ंक्शन को कॉल करने का समर्थन करता है। erl_rpc_to() दूरस्थ नोड के लिए RPC अनुरोध भेजता है और erl_rpc_from() ऐसी कॉल के परिणाम प्राप्त करता है। erl_rpc() RPC अनुरोध भेजकर और परिणामों की प्रतीक्षा करके इन दोनों कार्यों की कार्यक्षमता को जोड़ती है। rpc:call/4 भी देखें rpc:call/4 Kernel

  • fd एक इरलंग कनेक्शन का एक खुला विवरणक है।
  • परिणामों की प्रतीक्षा करने के लिए timeout अधिकतम समय (मिलीसेकंड में) है। हमेशा के लिए प्रतीक्षा करने के लिए, ERL_NO_TIMEOUT निर्दिष्ट करें। जब erl_rpc() कॉल erl_rpc_from() , तो कॉल कभी भी समाप्त नहीं होगी।
  • mod उस मॉड्यूल का नाम है जिसमें रिमोट नोड पर चलने वाले फ़ंक्शन होते हैं।
  • fun को चलाने के लिए फ़ंक्शन का नाम है।
  • args एक एरलैंग सूची है, जिसमें फ़ंक्शन को पारित करने के लिए तर्क होते हैं।
  • emsg फ़ंक्शन कॉल के परिणाम वाला एक संदेश है।

RPC सर्वर द्वारा लौटाया गया वास्तविक संदेश एक 2-tuple {rex,Reply} । यदि आप अपने कोड में erl_rpc_from() उपयोग करते हैं, तो यह वह संदेश है जिसे आपको पार्स करने की आवश्यकता होगी। यदि आप erl_rpc() उपयोग करते हैं, तो tuple स्वयं आपके लिए पार्स कर दिया जाता है, और आपके प्रोग्राम पर लौटाया गया संदेश Erlang शब्द है जिसमें केवल Reply । RPC अनुरोधों के उत्तर हमेशा ERL_SEND संदेश होते हैं।

ध्यान दें

यह कॉल करने वाले की जिम्मेदारी है कि वह लौटे हुए ETERM संरचना और emsg->msg और emsg->to द्वारा emsg->msg गई मेमोरी को मुक्त कर emsg->to

erl_rpc() सफलता पर दूरस्थ फ़ंक्शन का रिटर्न मान देता है, अन्यथा NULL

erl_rpc_to() सफलता पर 0 लौटाता है, अन्यथा एक नकारात्मक संख्या।

erl_rcp_from() सफलता पर ERL_MSG लौटाता है ( Emsg साथ अब Emsg ट्यूपल), अन्यथा ERL_TICK , ERL_TIMEOUT या ERL_ERROR

असफल होने पर, सभी तीन फ़ंक्शन erl_errno से किसी एक पर सेट erl_errno हैं:

ENOMEM
अधिक मेमोरी उपलब्ध नहीं है।
EIO
I / O त्रुटि।
ETIMEDOUT
समय समाप्त हो गया है।
EAGAIN
अस्थायी त्रुटि: पुन: प्रयास करें।

int erl_send(fd, to, msg)

प्रकार

एक प्रक्रिया के लिए एक इरलांग शब्द भेजता है।

  • fd एक इरलंग कनेक्शन का एक खुला विवरणक है।
  • एक इरलांग शब्द है जिसमें संदेश प्राप्त करने वाले की पीडा होती है।
  • > msg भेजने के लिए शब्द Erlang है।

सफलता पर 1 रिटर्न, अन्यथा 0 । बाद के मामले में erl_errno में से एक के लिए सेट किया गया है:

EINVAL
अमान्य तर्क: एक वैध एर्लांग पिड नहीं है।
ENOMEM
अधिक मेमोरी उपलब्ध नहीं है।
EIO
I / O त्रुटि।

const char *erl_thisalivename() const char *erl_thiscookie() short erl_thiscreation() const char *erl_thishostname() const char *erl_thisnodename()

C- नोड के बारे में जानकारी प्राप्त करता है। ये मान प्रारंभ में erl_connect_init() या erl_connect_xinit() साथ सेट किए erl_connect_init()

int erl_unpublish(alive)

प्रकार

यह फ़ंक्शन स्थानीय होस्ट पर ईपीएमडी से निर्दिष्ट नोड को अपंजीकृत करने की प्रक्रिया द्वारा कहा जा सकता है। यह, हालांकि, आमतौर पर अनुमति नहीं है, जब तक कि ईपीएमडी को फ्लैग के साथ शुरू नहीं किया गया -relaxed_command_check , जो यह सामान्य रूप से नहीं है।

आपके द्वारा प्रकाशित एक नोड को अपंजीकृत करने के लिए, आपको इसके बजाय ei_publish() द्वारा लौटाए गए ei_publish() को बंद करना चाहिए।

चेतावनी

यह फ़ंक्शन हटा दिया गया है और भविष्य में रिलीज़ में हटा दिया जाएगा।

alive नोड का नाम अपंजीकृत है, अर्थात, नोड नाम का पहला घटक, @hostname बिना।

यदि ईपीएमडी से नोड को सफलतापूर्वक अपंजीकृत किया गया था, तो 0 लौटा दिया गया है, अन्यथा -1 लौटा दिया गया है और erl_errno को EIO सेट किया गया है।

int erl_xreceive_msg(fd, bufpp, bufsizep, emsg)

प्रकार

erl_receive_msg समान। अंतर यह है कि erl_xreceive_msg उम्मीद है कि बफर को erl_xreceive_msg द्वारा आवंटित किया गया है, और इसे प्राप्त करता है यदि प्राप्त संदेश मूल बफर में फिट नहीं होता है। इसलिए बफर और बफर लंबाई दोनों को संकेत के रूप में दिया जाता है; कॉल द्वारा उनके मान बदल सकते हैं।

सफलता मिलने पर, फ़ंक्शन ERL_MSG लौटाता है और Emsg संरचना को ऊपर वर्णित के अनुसार प्रारंभ किया जाता है, या ERL_TICK , जिस स्थिति में कोई संदेश वापस नहीं आता है। विफलता पर, फ़ंक्शन ERL_ERROR लौटाता है और erl_errno को इनमें से एक में सेट करता है:

EMSGSIZE
बफर बहुत छोटा है।
ENOMEM
अधिक मेमोरी उपलब्ध नहीं है।
EIO
I / O त्रुटि।

struct hostent *erl_gethostbyaddr(addr, length, type) struct hostent *erl_gethostbyaddr_r(addr, length, type, hostp, buffer, buflen, h_errnop) struct hostent *erl_gethostbyname(name) struct hostent *erl_gethostbyname_r(name, hostp, buffer, buflen, h_errnop) struct hostent *erl_gethostbyaddr_r(addr, length, type, hostp, buffer, buflen, h_errnop) struct hostent *erl_gethostbyname_r(name, hostp, buffer, buflen, h_errnop)

प्रकार

कुछ सामान्य नाम लुकअप फ़ंक्शन के लिए सुविधा फ़ंक्शन।

डिबग जानकारी

यदि कोई कनेक्शन प्रयास विफल हो जाता है, तो निम्न जाँच की जा सकती है:

  • erl_errno
  • कि सही कुकी का उपयोग किया गया था
  • वह ईपीएमडी चला रहा है
  • कि दूसरी तरफ का दूरस्थ एर्लैंग नोड erl_interface के उसी संस्करण को erl_interface लाइब्रेरी के रूप में erl_interface है