यूनिक्स सॉकेट - कोर फ़ंक्शंस

यह अध्याय एक पूर्ण टीसीपी क्लाइंट और सर्वर लिखने के लिए आवश्यक कोर सॉकेट फ़ंक्शन का वर्णन करता है।

निम्नलिखित आरेख संपूर्ण क्लाइंट और सर्वर इंटरैक्शन दिखाता है -

सॉकेट फंक्शन

नेटवर्क I / O निष्पादित करने के लिए, पहली चीज़ जो एक प्रक्रिया को करना चाहिए, वह सॉकेट फ़ंक्शन को कॉल करना, संचार प्रोटोकॉल के प्रकार को निर्दिष्ट करना और प्रोटोकॉल परिवार, आदि।

#include <sys/types.h>
#include <sys/socket.h>

int socket (int family, int type, int protocol);

यह कॉल एक सॉकेट डिस्क्रिप्टर देता है जिसे आप बाद में सिस्टम कॉल में या -1 त्रुटि पर उपयोग कर सकते हैं।

मापदंडों

family - यह प्रोटोकॉल परिवार को निर्दिष्ट करता है और नीचे दिखाए गए स्थिरांक में से एक है -

परिवार विवरण
AF_INET IPv4 प्रोटोकॉल
AF_INET6 IPv6 प्रोटोकॉल
AF_LOCAL यूनिक्स डोमेन प्रोटोकॉल
AF_ROUTE रूटिंग सॉकेट्स
AF_KEY केट सॉकेट

यह अध्याय IPv4 को छोड़कर अन्य प्रोटोकॉल को कवर नहीं करता है।

type- यह आपके इच्छित सॉकेट को निर्दिष्ट करता है। यह निम्न में से एक मान ले सकता है -

प्रकार विवरण
SOCK_STREAM स्ट्रीम सॉकेट
SOCK_DGRAM डाटाग्राम सॉकेट
SOCK_SEQPACKET जब्त पैकेट सॉकेट
SOCK_RAW कच्चा सॉकेट

protocol - तर्क को नीचे दिए गए विशिष्ट प्रोटोकॉल प्रकार पर सेट किया जाना चाहिए, या परिवार और प्रकार के दिए गए संयोजन के लिए सिस्टम के डिफ़ॉल्ट का चयन करने के लिए -

मसविदा बनाना विवरण
IPPROTO_TCP टीसीपी परिवहन प्रोटोकॉल
IPPROTO_UDP यूडीपी परिवहन प्रोटोकॉल
IPPROTO_SCTP SCTP परिवहन प्रोटोकॉल

कनेक्ट समारोह

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

#include <sys/types.h>
#include <sys/socket.h>

int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);

यदि यह सर्वर से सफलतापूर्वक कनेक्ट होता है, तो यह कॉल 0 देता है, अन्यथा यह त्रुटि पर -1 देता है।

मापदंडों

  • sockfd - यह सॉकेट फ़ंक्शन द्वारा लौटाया गया सॉकेट डिस्क्रिप्टर है।

  • serv_addr - यह संरचित सॉकड्रेड के लिए एक संकेतक है जिसमें गंतव्य आईपी पता और पोर्ट होता है।

  • addrlen - इसे आकार-प्रकार (स्ट्रक्चर सॉकड्रेड) पर सेट करें।

बाँध समारोह

बाँध समारोह सॉकेट के लिए एक स्थानीय प्रोटोकॉल पता प्रदान करती है। इंटरनेट प्रोटोकॉल के साथ, प्रोटोकॉल एड्रेस 16-बिट टीसीपी या यूडीपी पोर्ट नंबर के साथ 32-बिट IPv4 एड्रेस या 128-बिट IPv6 एड्रेस का संयोजन है। यह फ़ंक्शन केवल टीसीपी सर्वर द्वारा कहा जाता है।

#include <sys/types.h>
#include <sys/socket.h>

int bind(int sockfd, struct sockaddr *my_addr,int addrlen);

यह कॉल 0 पर वापस लौटता है, यदि यह सफलतापूर्वक पते से जुड़ता है, अन्यथा यह त्रुटि पर -1 देता है।

मापदंडों

  • sockfd - यह सॉकेट फ़ंक्शन द्वारा लौटाया गया सॉकेट डिस्क्रिप्टर है।

  • my_addr - यह स्थानीय आईपी पते और पोर्ट को शामिल करने वाले sockaddr का पॉइंटर है।

  • addrlen - इसे आकार-प्रकार (स्ट्रक्चर सॉकड्रेड) पर सेट करें।

आप अपने आईपी पते और अपने पोर्ट को स्वचालित रूप से रख सकते हैं

पोर्ट नंबर के लिए 0 मान का अर्थ है कि सिस्टम एक यादृच्छिक पोर्ट का चयन करेगा, और IP पते के लिए INADDR_ANY मान का अर्थ है कि सर्वर का आईपी पता स्वचालित रूप से असाइन किया जाएगा।

server.sin_port = 0;  		     
server.sin_addr.s_addr = INADDR_ANY;

NOTE- 1024 से नीचे के सभी पोर्ट आरक्षित हैं। आप 1024 से ऊपर और 65535 से नीचे एक पोर्ट सेट कर सकते हैं जब तक कि वे अन्य कार्यक्रमों द्वारा उपयोग किए जाने वाले नहीं हैं।

सुनने समारोह

सुनने समारोह केवल एक TCP सर्वर से पुकारा जाता है और यह दो कार्य करता है -

  • सुनने का कार्य एक असंबद्ध सॉकेट को एक निष्क्रिय सॉकेट में परिवर्तित करता है, यह दर्शाता है कि कर्नेल को इस सॉकेट के लिए आने वाले कनेक्शन अनुरोधों को स्वीकार करना चाहिए।

  • इस फ़ंक्शन के लिए दूसरा तर्क निर्दिष्ट करता है कि इस सॉकेट के लिए कर्नेल को कतार में अधिकतम कनेक्शन चाहिए।

#include <sys/types.h>
#include <sys/socket.h>

int listen(int sockfd,int backlog);

यह कॉल सफलता पर 0 देता है, अन्यथा यह त्रुटि पर -1 देता है।

मापदंडों

  • sockfd - यह सॉकेट फ़ंक्शन द्वारा लौटाया गया सॉकेट डिस्क्रिप्टर है।

  • backlog - यह अनुमत कनेक्शनों की संख्या है।

स्वीकार समारोह

स्वीकार समारोह एक TCP सर्वर से पुकारा जाता है पूरा कनेक्शन कतार के सामने से अगले पूरा कनेक्शन वापस जाने के लिए। कॉल का हस्ताक्षर इस प्रकार है -

#include <sys/types.h>
#include <sys/socket.h>

int accept (int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);

यह कॉल सफलता पर एक गैर-नकारात्मक विवरणक देता है, अन्यथा यह त्रुटि पर -1 देता है। लौटे डिस्क्रिप्टर को क्लाइंट सॉकेट डिस्क्रिप्टर माना जाता है और क्लाइंट के साथ संवाद करने के लिए इस डिस्क्रिप्टर पर सभी रीड-राइट ऑपरेशन किए जाएंगे।

मापदंडों

  • sockfd - यह सॉकेट फ़ंक्शन द्वारा लौटाया गया सॉकेट डिस्क्रिप्टर है।

  • cliaddr - यह क्लाइंट आईपी एड्रेस और पोर्ट को शामिल करने के लिए सॉकड्रेड को पॉइंटर करता है।

  • addrlen - इसे आकार-प्रकार (स्ट्रक्चर सॉकड्रेड) पर सेट करें।

भेजने समारोह

भेजने समारोह धारा सॉकेट या कनेक्ट किए गए आंकड़ारेख सॉकेट पर डेटा भेजने के लिए इस्तेमाल किया जाता है। यदि आप UNCONNECTED डेटाग्राम सॉकेट पर डेटा भेजना चाहते हैं, तो आपको sendto () फ़ंक्शन का उपयोग करना होगा।

डेटा भेजने के लिए आप राइट () सिस्टम कॉल का उपयोग कर सकते हैं । इसका हस्ताक्षर इस प्रकार है -

int send(int sockfd, const void *msg, int len, int flags);

यह कॉल बाहर भेजे गए बाइट्स की संख्या लौटाता है, अन्यथा यह त्रुटि पर -1 वापस आ जाएगा।

मापदंडों

  • sockfd - यह सॉकेट फ़ंक्शन द्वारा लौटाया गया सॉकेट डिस्क्रिप्टर है।

  • msg - यह उस डेटा के लिए एक पॉइंटर है जिसे आप भेजना चाहते हैं।

  • len - यह उस डेटा की लंबाई है जिसे आप भेजना चाहते हैं (बाइट्स में)।

  • flags - यह 0 पर सेट है।

recv समारोह

Recv समारोह धारा सॉकेट या कनेक्ट किए गए आंकड़ारेख सॉकेट पर डेटा प्राप्त करने के लिए प्रयोग किया जाता है। यदि आप UNCONNECTED डेटाग्राम सॉकेट पर डेटा प्राप्त करना चाहते हैं, तो आपको recvfrom () का उपयोग करना होगा।

डेटा पढ़ने के लिए आप रीड () सिस्टम कॉल का उपयोग कर सकते हैं । यह कॉल सहायक कार्यों के अध्याय में समझाया गया है।

int recv(int sockfd, void *buf, int len, unsigned int flags);

यह कॉल बफ़र में पढ़ी गई बाइट्स की संख्या को लौटाता है, अन्यथा यह त्रुटि पर -1 वापस आ जाएगी।

मापदंडों

  • sockfd - यह सॉकेट फ़ंक्शन द्वारा लौटाया गया सॉकेट डिस्क्रिप्टर है।

  • buf - यह जानकारी में पढ़ने के लिए बफर है।

  • len - यह बफर की अधिकतम लंबाई है।

  • flags - यह 0 पर सेट है।

सेंडटो फंक्शन

Sendto समारोह असंबद्ध आंकड़ारेख सॉकेट पर डेटा भेजने के लिए इस्तेमाल किया जाता है। इसका हस्ताक्षर इस प्रकार है -

int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);

यह कॉल भेजे गए बाइट्स की संख्या लौटाता है, अन्यथा यह त्रुटि पर -1 देता है।

मापदंडों

  • sockfd - यह सॉकेट फ़ंक्शन द्वारा लौटाया गया सॉकेट डिस्क्रिप्टर है।

  • msg - यह उस डेटा के लिए एक पॉइंटर है जिसे आप भेजना चाहते हैं।

  • len - यह उस डेटा की लंबाई है जिसे आप भेजना चाहते हैं (बाइट्स में)।

  • flags - यह 0 पर सेट है।

  • to - यह होस्ट के लिए स्ट्रक्चर सॉकड्रेड के लिए एक पॉइंटर है जहां डेटा भेजा जाना है।

  • tolen - यह इसे आकार-प्रकार (स्ट्रक्चरल सॉकड्रेड) के लिए सेट किया गया है।

recvfrom समारोह

Recvfrom समारोह असंबद्ध आंकड़ारेख सॉकेट से डेटा प्राप्त किया जाता है।

int recvfrom(int sockfd, void *buf, int len, unsigned int flags struct sockaddr *from, int *fromlen);

यह कॉल बफ़र में पढ़ी गई बाइट्स की संख्या को लौटाता है, अन्यथा यह त्रुटि पर -1 देता है।

मापदंडों

  • sockfd - यह सॉकेट फ़ंक्शन द्वारा लौटाया गया सॉकेट डिस्क्रिप्टर है।

  • buf - यह जानकारी में पढ़ने के लिए बफर है।

  • len - यह बफर की अधिकतम लंबाई है।

  • flags - यह 0 पर सेट है।

  • from - यह होस्ट के लिए स्ट्रक्चर सॉकड्रेड के लिए एक पॉइंटर है जहां डेटा को पढ़ना पड़ता है।

  • fromlen - यह इसे आकार-प्रकार (स्ट्रक्चरल सॉकड्रेड) के लिए सेट किया गया है।

करीब समारोह

करीब समारोह क्लाइंट और सर्वर के बीच संचार को बंद करने के लिए किया जाता है। इसका सिंटैक्स इस प्रकार है -

int close( int sockfd );

यह कॉल सफलता पर 0 देता है, अन्यथा यह त्रुटि पर -1 देता है।

मापदंडों

  • sockfd - यह सॉकेट फ़ंक्शन द्वारा लौटाया गया सॉकेट डिस्क्रिप्टर है।

बंद समारोह

शटडाउन समारोह शान से क्लाइंट और सर्वर के बीच संचार को बंद करने के लिए किया जाता है। यह फ़ंक्शन नजदीकी फ़ंक्शन की तुलना में अधिक नियंत्रण देता है। नीचे दिए गए शटडाउन का सिंटैक्स है -

int shutdown(int sockfd, int how);

यह कॉल सफलता पर 0 देता है, अन्यथा यह त्रुटि पर -1 देता है।

मापदंडों

  • sockfd - यह सॉकेट फ़ंक्शन द्वारा लौटाया गया सॉकेट डिस्क्रिप्टर है।

  • how - संख्या में से एक रखो -

    • 0 - इंगित करता है कि प्राप्त करने की अनुमति नहीं है,

    • 1 - इंगित करता है कि भेजने की अनुमति नहीं है, और

    • 2- इंगित करता है कि भेजने और प्राप्त करने दोनों की अनुमति नहीं है। जब कैसे 2 के लिए सेट है, यह पास के रूप में एक ही बात है ()।

फ़ंक्शन का चयन करें

चुनिंदा समारोह को इंगित करता है जो निर्दिष्ट फ़ाइल वर्णनकर्ता के लेखन के लिए, पढ़ने के लिए तैयार के लिए तैयार है, या एक त्रुटि स्थिति लंबित है।

जब कोई एप्लिकेशन recv या recvfrom कहता है , तब तक इसे ब्लॉक किया जाता है जब तक कि उस सॉकेट के लिए डेटा नहीं आ जाता है। एक एप्लिकेशन अन्य उपयोगी प्रसंस्करण कर सकता है जबकि आने वाली डेटा स्ट्रीम खाली है। एक अन्य स्थिति तब होती है जब कोई एप्लिकेशन कई सॉकेट से डेटा प्राप्त करता है।

एक सॉकेट पर recv या recvfrom को कॉल करना, जिसकी इनपुट कतार में कोई डेटा नहीं है, अन्य सॉकेट्स से डेटा के तत्काल स्वागत को रोकता है। चयनित फ़ंक्शन कॉल इस समस्या को हल करता है ताकि प्रोग्राम को सभी सॉकेट हैंडल को देखने की अनुमति मिल सके कि वे गैर-अवरुद्ध पढ़ने और लिखने के संचालन के लिए उपलब्ध हैं।

नीचे दिए गए चयन का वाक्य विन्यास है -

int select(int  nfds, fd_set  *readfds, fd_set  *writefds, fd_set *errorfds, struct timeval *timeout);

यह कॉल सफलता पर 0 देता है, अन्यथा यह त्रुटि पर -1 देता है।

मापदंडों

  • nfds- यह परीक्षण किए जाने वाले फ़ाइल डिस्क्रिप्टर की सीमा को निर्दिष्ट करता है। चयन () फ़ंक्शन परीक्षण फ़ाइल विवरणकों को 0 से nfds-1 की श्रेणी में दर्ज करता है

  • readfds- यह टाइप fd_set के ऑब्जेक्ट को इंगित करता है कि इनपुट पर, फ़ाइल डिस्क्रिप्टर को पढ़ने के लिए तैयार होने के लिए जाँचने के लिए निर्दिष्ट करता है, और आउटपुट पर, यह इंगित करता है कि कौन से फाइल डिस्क्रिप्टर पढ़ने के लिए तैयार हैं। खाली सेट का संकेत देना NULL हो सकता है।

  • writefds- यह एक प्रकार की वस्तु के लिए इंगित करता है fd_set कि इनपुट पर, फ़ाइल डिस्क्रिप्टर को लिखने के लिए तैयार होने के लिए जाँच करने के लिए निर्दिष्ट करता है, और आउटपुट पर, यह इंगित करता है कि कौन से फाइल डिस्क्रिप्टर लिखने के लिए तैयार हैं। खाली सेट का संकेत देना NULL हो सकता है।

  • exceptfds- यह टाइप fd_set के ऑब्जेक्ट को इंगित करता है कि इनपुट पर, लंबित त्रुटि स्थितियों की जाँच के लिए फ़ाइल डिस्क्रिप्टर निर्दिष्ट करता है, और आउटपुट इंगित करता है कि किस फाइल डिस्क्रिप्टर में त्रुटि की स्थिति लंबित है। खाली सेट का संकेत देना NULL हो सकता है।

  • timeout- यह एक टाइमवेल स्ट्रक्चर की ओर इशारा करता है जो यह निर्दिष्ट करता है कि उपलब्ध आई / ओ ऑपरेशन के लिए डिलेक्टर्स को कितनी देर तक चयन करना चाहिए। यदि टाइमआउट मान 0 है, तो चयन तुरंत वापस आ जाएगा। यदि टाइमआउट तर्क NULL है, तो तब तक चयन करें जब तक कि उपलब्ध I / O ऑपरेशन के लिए कम से कम एक फ़ाइल / सॉकेट हैंडल तैयार न हो जाए। अन्यथा चयन समय समाप्त होने के बाद वापस आ जाएगा या जब कम से कम एक फ़ाइल / सॉकेट विवरणक एक I / O ऑपरेशन के लिए तैयार है।

चयन से वापसी मान फ़ाइल डिस्क्रिप्टर सेट में निर्दिष्ट हैंडल की संख्या है जो I / O के लिए तैयार हैं। यदि टाइमआउट फ़ील्ड द्वारा निर्दिष्ट समय सीमा समाप्त हो गई है, तो रिटर्न 0. का चयन करें। फ़ाइल विवरणक सेट में हेरफेर करने के लिए निम्न मैक्रोज़ मौजूद हैं -

  • FD_CLR(fd, &fdset)- फ़ाइल डिस्क्रिप्टर सेट fdset में फ़ाइल डिस्क्रिप्टर fd के लिए बिट को साफ करता है

  • FD_ISSET(fd, &fdset)- गैर-शून्य मान लौटाता है यदि फ़ाइल डिस्क्रिप्टर fd के लिए बिट फ़ाइल डिस्क्रिप्टर सेट में fdset द्वारा इंगित किया गया है , और 0 अन्यथा।

  • FD_SET(fd, &fdset) - फाइल डिस्क्रिप्टर सेट fdset में फाइल डिस्क्रिप्टर fd के लिए बिट सेट करता है।

  • FD_ZERO(&fdset) - फ़ाइल डिस्क्रिप्टर सेट fdset को सभी फ़ाइल डिस्क्रिप्टर के लिए शून्य बिट्स के लिए प्रारंभ करता है।

अगर fd तर्क 0 से कम है या FD_SETSIIE से अधिक है तो इन मैक्रोज़ का व्यवहार अपरिभाषित है।

उदाहरण

fd_set fds;

struct timeval tv;

/* do socket initialization etc.
tv.tv_sec = 1;
tv.tv_usec = 500000;

/* tv now represents 1.5 seconds */
FD_ZERO(&fds);

/* adds sock to the file descriptor set */
FD_SET(sock, &fds); 

/* wait 1.5 seconds for any data to be read from any single socket */
select(sock+1, &fds, NULL, NULL, &tv);

if (FD_ISSET(sock, &fds)) {
   recvfrom(s, buffer, buffer_len, 0, &sa, &sa_len);
   /* do something */
}
else {
   /* do something else */
}