2009-12-11 9 views
8

सर्वर से प्रतिक्रिया प्राप्त करते समय मेरा आरईवी फ़ंक्शन लटकता है। ग मेंसॉकेट प्रोग्रामिंग सी/सी ++ - आरईवी समारोह लटकता है?

क्लाइंट साइड कोड/C++:

void sockStuff() { 

int sock, bytes_recieved,bytes_send; 
char send_data[1024], recv_data[4096]; 

struct hostent *host; 
struct sockaddr_in server_addr; 

host = gethostbyname("127.0.0.1"); 

if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 
    perror("SocketError"); 
    exit(1); 
} 
server_addr.sin_family = AF_INET; 
server_addr.sin_port = htons(50500); 
server_addr.sin_addr = *((struct in_addr *) host->h_addr); 
bzero(&(server_addr.sin_zero), 8); 


if (connect(sock, (struct sockaddr *) &server_addr, sizeof(struct sockaddr)) 
    == -1) { 
    perror("ConnectToError"); 
    exit(1); 
} 


    bytes_send = send(sock, a, strlen(a), 0); 
    bytes_send = shutdown(sock, 1); 


bytes_recieved = recv(sock, recv_data, 4096, 0); //Where the program hangs?? 
recv_data[bytes_recieved] = '\0'; 
printf("\nRecieved data = %s ", recv_data); 
cout << endl << endl; 

shutdown(sock,2); 



} 

मेरा ग्राहक C/C++ और सर्वर साइड है OpenEdge प्रगति है। कृपया कोड देखें और सुझाव दें कि इसके साथ क्या गलत हुआ ??

+0

आपको जादू संख्या 8 के बजाय sizeof (server_addr.sin_zero) का उपयोग करना चाहिए। या फिर भी पूरी संरचना को शून्य करें और फिर उन फ़ील्ड को सेट करें जिन्हें आप रुचि रखते हैं। –

+0

हाय नील, क्या आप इसे और विस्तारित करने के लिए कृपया विस्तार से बता सकते हैं (server_addr.sin_zero) संख्या 8 की बजाय लेकिन अभी भी कोई भाग्य नहीं है। धन्यवाद। – Vishal

उत्तर

1

recv आपको तब तक लटका देना चाहिए जब तक आप सर्वर को प्रतिक्रिया प्राप्त न करें, क्या आपने कहा है कि प्रतिक्रिया भेजी जा रही है।
वायरसहार्क या नेटवर्क की कोशिश करने के लिए ऐसा कुछ करने का प्रयास करें और देखें कि वास्तविक प्रतिक्रिया आ रही है या नहीं।

+0

असल में recv() hangs के बाद, मैंने ctrl + alt + del की कोशिश की। इस कार्य प्रबंधक को खोलकर मैं इस कार्य प्रबंधक को बंद कर देता हूं (किसी भी प्रक्रिया को मार नहीं सकता) और अचानक यह मुझे एक बार प्रतिक्रिया देता है। लेकिन मेरा प्रोग्राम अभी भी स्थिर स्थिति में है । – Vishal

1

Ummm .... तुम क्यों बंद सॉकेट ....

 
bytes_send = send(sock, a, strlen(a), 0); 
    bytes_send = shutdown(sock, 1); /*** That I think is the problem! ***/ 


bytes_recieved = recv(sock, recv_data, 4096, 0); 

और फिर भी आप कोड में जारी एक ही सॉकेट कि बंद था से प्राप्त करने के लिए किया था ??

आशा है कि यह आपको सही दिशा में इंगित करता है, सर्वश्रेष्ठ संबंध, टॉम।

+0

Thnx। उत्तर देने के लिए टॉम। लेकिन शट डाउन (सॉक, 1); सॉकेट बंद नहीं कर रहा है। यह केवल इतना कह रहा है कि भेजने की अनुमति नहीं है (भेजने के लिए और कुछ नहीं।)। यहां तक ​​कि मैं इस लाइन को हटा देता हूं, मेरा आरईवी() लटकता है। – Vishal

+0

@ विशाल: ठीक है ... http: //www.developerweb.net/forum/showthread.php? T = 2 9 40 - शटडाउन का उपयोग करने के लिए एक दिलचस्प चर्चा abotu है .. कोड तुल्यकालिक मोड में है, यह संभव हो सकता है कि शटडाउन से पहले डेटा प्राप्त हो चुका है और इसलिए लटका है। क्या आपने इसके बारे में सोचा है ...? क्षमा करें अगर मैं यहां बहुत मदद नहीं कर रहा हूं ... :( – t0mm13b

1

सॉकेट तब तक अवरुद्ध हो जाएगा जब तक सॉकेट को ब्लॉकिंग मोड में तब तक पढ़ने की जानकारी न हो, जब आप इसे fcntl के साथ बदल सकते हैं।

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

मैं सुझाव देता हूं कि सॉकेट को गैर-अवरुद्ध मोड में सेट करने के लिए, फिर select पर कॉल करना होगा जो सॉकेट को पठनीय/लिखने योग्य/या टाइमआउट ट्रिगर होने तक अवरुद्ध कर देगा। आप जो कर रहे हैं उसके आधार पर, इससे कोई फर्क पड़ेगा।

1

गैर अवरोधन मोड का उपयोग करने का प्रयास करें। यानी अगर कोई डेटा पढ़ा नहीं जाता है, तो रीव वापस आ जाएगा, इसलिए इस मामले को संभालें (थोड़ी देर में लूप या चयन के साथ। यह आपके ऊपर है)

आरईवी पर अधिक के लिए, मान लें कि आप एक पॉज़िक्स अनुपालन प्रणाली पर हैं) इसे पढ़ें http://www.opengroup.org/onlinepubs/009695399/functions/recv.html

8

आपका कोड रिकॉव कॉल में अवरुद्ध होगा जब तक सर्वर कोई डेटा वापस नहीं भेजता। चूंकि यह नहीं हो रहा है, शायद आपको खुद से पूछना चाहिए कि क्या आपके ग्राहक ने पूरा अनुरोध भेजा है। पूरा अनुरोध प्राप्त होने तक सर्वर शायद प्रतिक्रिया भेजने शुरू नहीं करेगा।

यदि आपका क्लाइंट/सर्वर प्रोटोकॉल टेक्स्ट आधारित है, जैसे कि HTTP या SMTP, क्या आप सुनिश्चित हैं कि आपकी प्रतिक्रिया सही ढंग से समाप्त हो गई है? सर्वर सीआर + वामो ('\ r \ n') बस वामो के बजाय ('\ n') की उम्मीद की जा सकती है या इसे रिक्त लाइन अनुरोध को समाप्त करने की उम्मीद:

char *request = "GET /index.html HTTP/1.1\r\nHost: www.example.com\r\n\r\n"; 

पी एस। आप अपने कोड स्निपेट में 'ए' घोषित या प्रारंभ नहीं करते हैं।

4

आपका कोड रिकॉव कॉल में अवरुद्ध होगा जब तक सर्वर कोई डेटा वापस नहीं भेजता। चूंकि यह नहीं हो रहा है, शायद आपको खुद से पूछना चाहिए कि क्या आपके ग्राहक ने पूरा अनुरोध भेजा है। पूरा अनुरोध प्राप्त होने तक सर्वर शायद प्रतिक्रिया भेजने शुरू नहीं करेगा।

यदि आपका क्लाइंट/सर्वर प्रोटोकॉल टेक्स्ट आधारित है, जैसे कि HTTP या SMTP, क्या आप सुनिश्चित हैं कि आपकी प्रतिक्रिया सही ढंग से समाप्त हो गई है? सर्वर केवल एलएफ ('\ n') की बजाय सीआर + एलएफ ('\ r \ n') की अपेक्षा कर सकता है या यह अनुरोध को समाप्त करने के लिए खाली रेखा की अपेक्षा करता है:

char * request = "GET/index। एचटीएमएल HTTP/1.1 \ r \ nहोस्ट: www.example.com \ r \ n \ r \ n "; पुनश्च। आप अपने कोड स्निपेट में 'ए' घोषित नहीं करते हैं या शुरू नहीं करते हैं। "नोटैक

मैं जीत पर सी ++ में शुरुआती जीत 1.0 और 1.1 कार्यान्वयन पर अपनी प्रतिलिपि पर काम कर रहा था। मेरा कोड रिकिव करने के लिए सभी तरह से काम करता है () कॉल करें, और फिर बस वहां लटकाएं ... मुझे \ Non अवरुद्ध सॉकेट को अवरुद्ध करने के बारे में पता था, लेकिन यह वह समाधान नहीं था जिसकी मुझे आवश्यकता थी। चूंकि मैंने वायरसहार्क में अपना अनुरोध देखा था या इसी तरह मुझे पता था कि सर्वर स्ट्रिंग अनुरोध का मेरा अंत प्राप्त कर रहा था पोर्ट 80, और मेरे क्लाइंट और सर्वर के बीच गैर संचार के कारण आरईवी() कॉल पर मेरा कोड फ्रीज हो रहा है, जिसने मुझे विश्वास दिलाया कि मैंने उचित अनुरोध सबमिट नहीं किया है। अच्छा, लेखक (नोटकाट) स्पॉट पर था! जैसे ही मैंने अपने अनुरोध में बदल दिया ("GET /index.html HTTP/1.1 \ r \ n होस्ट: www.example.com \ r \ n \ r \ n"), सब एक आकर्षण की तरह काम करने लगते हैं! धन्यवाद !!

संबंधित मुद्दे