सी

2012-05-10 1 views
5

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

while(1) 
{ 
    //some queue using code 
    sleep(100); 
} 

तो: मैं कुछ इस तरह होना चाहिए प्रबंधित किया जाना

सामान्य सर्वरों में यह कैसे किया जाता है, क्या उनके पास कुछ समय अंतराल होता है जिसके बाद वे जो भी करने की ज़रूरत होती है उसे जांचते हैं या ऐसा करने का अधिक उचित तरीका है?

यह एक बहुत ही बुनियादी जवाब है, और परिभाषाओं और प्रोटोटाइप की जरूरत है जगह में हो सकता है, लेकिन है कि आप एक बुनियादी का चयन करें, उदाहरण देना चाहिए:

+8

सी में विशिष्ट नेटवर्किंग कोड आमतौर पर ['select()'] (http://stackoverflow.com/questions/4171270/select-function-in-socket-programming) जैसे कुछ के साथ किया जाता है, जो घटना-आधारित है । यहां एक बहुत अच्छी मार्गदर्शिका है (कम से कम जब मैंने इसका इस्तेमाल किया): http://beej.us/guide/bgnet/ – birryree

+0

क्या() फ़ंक्शंस सिस्टम वी कतारों के आईडी के साथ काम करता है? – Andna

+1

मुझे इसके बारे में निश्चित नहीं है (मैंने शायद 7 वर्षों में सिस्टम वी सामान को छुआ नहीं है), लेकिन ऊपर दिए गए मार्गदर्शिका का हिस्सा सिस्टम वी क्यू के उपयोग पर भी चर्चा करता है: http://beej.us/guide /bgipc/output/html/multipage/mq.html हालांकि मैं आपके मामले में सोचता हूं, आप क्या करेंगे, क्लाइंट कनेक्ट हैं और अपने सॉकेट/डिस्क्रिप्टर पर चयन करते हैं, और उनके लिए कतार प्रबंधित करते हैं ('select()' के बजाय - कतार में आईएनजी)। – birryree

उत्तर

3

आप इस की तर्ज पर कुछ करने के लिए।

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

struct timeval timeout; 
int rc 
fd_set wfdset,rfdset,errfdset; 
//Do some checks put them in either read fdset or write fdset or error fdset 
FD_SET (socket_sd, &rfdset); 
timeout.tv_sec = 0; 
timeout.tv_usec = 250 * 1000; 
rc = select (maxfds + 1, &rfdset, &wfdset, NULL, &timeout); 
//loop through the sockets and read from them at this point. 

का चयन करें, साथ ही Win32 के लिए पोर्टेबल यूनिक्स है, हालांकि यह अगर आप यूनिक्स IE में सॉकेट पर कोई प्रयास कर रहे हैं की सिफारिश की पसंद नहीं है: FreeBSD। Kqueue या epoll या जैसे कि आपको गहराई से और अपने सॉकेट का अधिक प्रबंधन करने की आवश्यकता है, का उपयोग करें।