2012-05-25 9 views
5

जैसा कि मैं समझता हूं, बैकलॉगकनेक्शन कतार का आकार निर्धारित करता है। उस समय इस आकार से अधिक कोई अतिरिक्त अनुरोध बंद कर दिया जाएगा (यह स्टेटमेंट सही है ??)।सुनो() बैकलॉग मान को अनदेखा करें

अब मैं बहुत ही सरल कार्यक्रम server.c

socket() 
bind() 
listen(..., 5) 
while(1) 
{ 
    accept() 
    read() 
    write() 
    sleep(3) 
    close() 
} 

अब मैं इस सर्वर से कनेक्ट करने के लिए एक समय पर 8 ग्राहकों शुरू की है,। हैरानी की बात है कि सर्वर सभी 8 क्लाइंट्स परोसता है लेकिन इसके बजाय इसे केवल 5 क्लाइंट कतारबद्ध करना चाहिए & शेष 3 क्लाइंट अनुरोधों को अस्वीकार कर दिया जाना चाहिए। एक अन्य दिलचस्प बात यह है कि अगर मैं इस बैकलॉग मान को 0 के रूप में रखता हूं, तो परिणाम अभी भी वही है। फिर मैंने सुनो() कॉल पर टिप्पणी करने की कोशिश की, इस सभी 8 क्लाइंट कनेक्शन अस्वीकार कर दिए गए।

क्या कोई इस पर कोई इनपुट प्रदान कर सकता है।

+0

आप एक समवर्ती वातावरण में 'read',' write' और 'close' रखना चाहिए। आपके कोड में, जब अगला कनेक्शन 'स्वीकार' किया जाता है तो ऐसा लगता है कि पिछला वाला पहले ही बंद कर दिया गया है।कोड को थ्रेड में रखें और सुनिश्चित करें कि प्रत्येक कनेक्शन आपके सर्वर को अनुरोध करने के लिए स्थिति 8 क्लाइंट सुनिश्चित करने के लिए पर्याप्त समय तक पर्याप्त रूप से पर्याप्त होता है। –

+0

मैं ** बैकलॉग ** का परीक्षण कर रहा था ** कभी-कभी वापस और कहीं भी नहीं मिला। अब जवाब देखने की उम्मीद है। – tuxuday

+0

ओपी, क्या आप अपना नमूना कोड पोस्ट कर सकते हैं। ताकि लोग कॉपी/पेस्ट कर सकें और इसका परीक्षण कर सकें। – tuxuday

उत्तर

2

बैकलॉग तर्क कतार के आकार के बारे में संकेत है। तो आप जो भी पूछ रहे हैं उसे करने के लिए आप उस पर भरोसा नहीं कर सकते हैं।

listen()

यह answer इसे कवर करने लगता है।

और अधिक जानकारी, मेरे Ubuntu पर सुनने (2) आदमी पृष्ठ से एक उद्धरण:

बैकलॉग तर्क जो करने के लिए sockfd के लिए लंबित कनेक्शन की कतार बढ़ सकती है अधिकतम लंबाई को परिभाषित करता है। यदि कतार पूर्ण होने पर कनेक्शन अनुरोध आता है, क्लाइंट को ECONNREFUSED के संकेत के साथ एक त्रुटि प्राप्त हो सकती है या, यदि अंतर्निहित प्रोटोकॉल रीट्रान्समिशन का समर्थन करता है, तो अनुरोध को अनदेखा किया जा सकता है ताकि बाद में कनेक्शन सफल हो सके।

ध्यान दें कि यह हर जगह "मई" कहता है।

+0

मेरे सिस्टम में SOMAXCONN 128 पर सेट है। तो क्या होगा व्यवहार करें यदि मैं एक समय में 128 से अधिक क्लाइंट शुरू करता हूं। – user1409528

+0

हां, विनिर्देश कहता है कि 128 तक के मान समर्थित होंगे, लेकिन वास्तव में बकाया कनेक्शन को सीमित करने का कोई दायित्व नहीं है। और मुझे लगता है कि यह विनिर्देश आप जो भी उपयोग कर रहे हैं उसके समान है। –

+0

मेरे उत्तर का संशोधन देखें। –

0

मैंने किया है आदमी अपने सिस्टम & निम्नलिखित विवरण मिलता है पर सुनने:

वर्णन

सुनने(), सॉकेट से एक निष्क्रिय सॉकेट, वह यह है कि के रूप में करने के लिए भेजा sockfd के निशान एक सॉकेट के रूप में है कि होगा स्वीकार (2) का उपयोग कर आने वाले कनेक्शन अनुरोधों को स्वीकार करने के लिए इस्तेमाल किया जाना चाहिए। sockfd तर्क एक फ़ाइल वर्णनकर्ता है जो SOCK_STREAM या SOCK_SEQPACKET प्रकार की सॉकेट को संदर्भित करता है। बैकलॉग तर्क अधिकतम लंबाई को परिभाषित करता है जिस पर सॉकफ़ेड के लिए लंबित कनेक्शन की कतार बढ़ सकती है। यदि कतार पूर्ण होने पर कनेक्शन अनुरोध आता है, तो ग्राहक को ECONNREFUSED के संकेत के साथ एक त्रुटि प्राप्त हो सकती है या, यदि अंतर्निहित प्रोटोकॉल रीट्रान्समिशन का समर्थन करता है, तो अनुरोध को अनदेखा किया जा सकता है ताकि बाद में कनेक्शन पर पुनः प्रयास किया जा सके।

+0

फिर से, "मई" शब्द का उपयोग ध्यान दें। बैकलॉग का सम्मान करने की कोई आवश्यकता नहीं है। –

+0

** यदि कतार पूर्ण होने पर कनेक्शन अनुरोध आता है, तो ग्राहक को ECONNREFUSED के संकेत के साथ एक त्रुटि प्राप्त हो सकती है या, यदि अंतर्निहित प्रोटोकॉल रीट्रान्समिशन का समर्थन करता है, तो अनुरोध को अनदेखा किया जा सकता है ताकि बाद में कनेक्शन पर पुनः प्रयास किया जा सके। ** ठीक है, आपका मतलब है कि यह कनेक्शन को अस्वीकार कर सकता है लेकिन मेरे मामले में, यह बाद में कनेक्शन को पुनः प्रयास कर रहा है। सही?? – user1409528

+0

वैसे आपके मामले में शायद क्या हो रहा है यह है कि यह कनेक्शन कतार में है। मुद्दा यह है कि, आप इस पर निर्भर नहीं कर सकते कि कनेक्शन को अस्वीकार कर सकते हैं और न ही कतारबद्ध कर सकते हैं, क्योंकि ऐसा नहीं है कि सुनो() की विशिष्टता की आवश्यकता है। और यहां तक ​​कि अगर यह कुछ कार्यान्वयन में एक निश्चित तरीके से काम करता है, तो यह किसी भी भविष्य के अपडेट में बदलाव के अधीन है, इसलिए आपको इस पर निर्भर नहीं होना चाहिए। –

0

Server.c

#include <sys/types.h> 
#include <sys/socket.h> 
#include <stdio.h> 
#include <sys/un.h> 
#include <unistd.h> 
int main() 
{ 
    int server_sockfd, client_sockfd; 
    int server_len, client_len; 
    struct sockaddr_un server_address; 
    struct sockaddr_un client_address; 

    unlink(“server_socket”); 
    server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0); 

    server_address.sun_family = AF_UNIX; 
    strcpy(server_address.sun_path, “server_socket”); 
    server_len = sizeof(server_address); 
    bind(server_sockfd, (struct sockaddr *)&server_address, server_len); 

    listen(server_sockfd, 5); 
    while(1) 
    { 
     char ch; 
     printf(“server waiting\n”); 

     client_len = sizeof(client_address); 
     client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address, &client_len); 

     read(client_sockfd, &ch, 1); 
     ch++; 
     write(client_sockfd, &ch, 1); 
sleep(3); 
     close(client_sockfd); 
    } 
} 

Client.c

#include <sys/types.h> 
#include <sys/socket.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/un.h> 
#include <unistd.h> 

int main() 
{ 
    int sockfd; 
    int len; 
    struct sockaddr_un address; 
    int result; 
    char ch = ‘A’; 

    sockfd = socket(AF_UNIX, SOCK_STREAM, 0); 

    address.sun_family = AF_UNIX; 
    strcpy(address.sun_path, “server_socket”); 
    len = sizeof(address); 

    result = connect(sockfd, (struct sockaddr *)&address, len); 
    if(result == -1) 
    { 
     perror(“oops: client1”); 
     exit(1); 
    } 

    write(sockfd, &ch, 1); 
    read(sockfd, &ch, 1); 
    printf(“char from server = %c\n”, ch); 
    close(sockfd); 
    exit(0); 
} 
संबंधित मुद्दे