2012-03-25 16 views
10

मैं चयन() के आधार पर रीट्रान्समिशन के लिए टाइमर के उपयोग की जांच करने के लिए एक मूल क्लाइंट/सर्वर इको प्रोग्राम लिखने की कोशिश कर रहा हूं (हालांकि मुझे डीबगिंग को सरल बनाने के लिए उस बिट को टिप्पणी करना पड़ा जब यह इरादे के रूप में काम नहीं कर रहा था)। यहाँ प्रासंगिक कोड के स्निपेट होते:पायथन यूडीपी क्लाइंट/सर्वर प्रोग्राम, समस्याएं

सर्वर:

from socket import * 
import sys 
import select 
address = ('localhost', 6005) 
server_socket = socket(AF_INET, SOCK_DGRAM) 
server_socket.bind(address) 

while(1): 
    print "Listening" 
    recv_data, addr = server_socket.recvfrom(2048) 
    print recv_data 
    if recv_data == "Request 1" : 
     print "Received request 1" 
     server_socket.sendto("Response 1", address) 
    elif recv_data == "Request 2" : 
     print "Received request 2" 
     data = "Response 2" 
     server_socket.sendto(data, address) 

ग्राहक:

from socket import * 
import sys 
import select 

address = ('localhost', 6005) 
client_socket = socket(AF_INET, SOCK_DGRAM) 

num_retransmits = 0 
while(num_retransmits < 60): 
    num_retransmits = num_retransmits + 1 


    data = "Request 1" 
    client_socket.sendto(data, address) 
    print "Sending request 1" 

    recv_data, addr = client_socket.recvfrom(2048) 

    print recv_data, "!!" 

ग्राहक पर उत्पादन बस के अनुरोध भेजा जा रहा है 1 'है, और जब एक ब्रेकप्वाइंट पर प्रयोग किया जाता है रिकॉर्फ़ॉम कॉल पर या नीचे कुछ भी, यह ब्रेकपॉइंट तक नहीं पहुंचता है। इसलिए मुझे लगता है कि क्लाइंट कुछ भी प्राप्त नहीं कर रहा है और यह कर रहा है। दूसरी ओर, सर्वर पर उत्पादन होता है:

  • अनुरोध 1
  • प्राप्त अनुरोध 1
  • सुनकर पर और इतने
  • रिस्पांस 1

और इतने सुनकर आगे

पहले लूप के बाद, सर्वर फिर से लूप करता है और पी प्रतिक्रिया का जवाब देता है 1. इसका मतलब है कि सर्वर ने अनुरोध 1 प्राप्त करने के लिए क्या किया था, क्लाइंट को प्रतिक्रिया 1 भेजें, लूप ... लेकिन इसके बाद दूसरी बार लूप्स, प्रतिक्रिया 1 अपनी सॉकेट में अभी भी है! यही कारण है कि जब यह recv_data प्रिंट करता है, तो यह प्रतिक्रिया 1 प्रिंट करता है। दूसरी ओर, क्लाइंट recv_data प्रिंट नहीं कर रहा है, क्योंकि क्लाइंट को यह प्राप्त नहीं हुआ है - यह अभी भी सर्वर की सॉकेट के बफर में है।

कृपया मदद करें - मैंने अन्य गूंज कार्यक्रमों को देखने की कोशिश की है, लेकिन वे सभी टीसीपी का उपयोग करने लगते हैं और काफी सरल हैं (और मुझे लगता है कि मैंने काफी कदम उठाए हैं)। मुझे नहीं पता कि मेरा यूडीपी कार्यक्रम क्यों काम नहीं कर रहा है। मैंने sendall() कॉल को देखने की कोशिश की लेकिन यह केवल टीसीपी के लिए काम करता प्रतीत होता है।

उत्तर

14

आपको पते के बजाय addr को भेजना होगा।

from socket import * 
import sys 
import select 
address = ('localhost', 6005) 
server_socket = socket(AF_INET, SOCK_DGRAM) 
server_socket.bind(address) 

while(1): 
    print "Listening" 
    recv_data, addr = server_socket.recvfrom(2048) 
    print recv_data 
    if recv_data == "Request 1" : 
     print "Received request 1" 
     server_socket.sendto("Response 1", addr) 
    elif recv_data == "Request 2" : 
     print "Received request 2" 
     data = "Response 2" 
     server_socket.sendto(data, addr) 
+0

धन्यवाद! किसी कारण से यह पोस्ट दिखाई नहीं दे रहा था: एस लेकिन हाँ, यह तय है – misaochan

1

शायद लाइन 10 सर्वर साइड पर

recv_data, addr = server_socket.recvfrom (2048)

होना चाहिए

recv_data, addr = server_socket.sendto (2048)

?

ps> मैं एक नोब हूं। = पी

+4

धन्यवाद। मैंने आपसे कुछ भी प्राप्त करने की तुलना में आपको जवाब देने की कोशिश की और अधिक सीख लिया। –

2

यहां क्या हो रहा है यह सर्वर 'Response 1'localhost:6005 पर भेज रहा है, और फिर इसे तुरंत प्राप्त कर रहा है क्योंकि यह localhost:6005 पर भी सुन रहा है।

सर्वर सही है जैसा कि (address, port) पर बाध्य करता है और सुनता है। जब क्लाइंट पहले बाध्यकारी के बिना कनेक्ट होता है, तो यह स्वचालित रूप से एक अप्रयुक्त (address, port) असाइन किया जाता है।आपको यह निर्धारित करने की आवश्यकता होगी कि (address, port) क्लाइंट इसका जवाब देने के लिए उपयोग कर रहा है - या तो bind द्वारा ज्ञात (address, port) को स्पष्ट रूप से सेट करने के लिए, या addrrecvfrom द्वारा लौटाकर उपयोग करने के लिए।

+0

धन्यवाद, मैं भी ऐसा सोच रहा था। हालांकि, निश्चित रूप से यह एक ही मशीन पर सर्वर और क्लाइंट दोनों का परीक्षण करने का एकमात्र तरीका है - पोर्ट ए और 'लोकलहोस्ट' को सर्वर से बांधें, फिर पोर्ट ए और लोकहोस्ट को सामान भेजने के लिए क्लाइंट का उपयोग करें? ग्राहकों के लिए भी बाध्य() का उपयोग किया जा सकता है? – misaochan

+0

ओह, धन्यवाद! यह सब ठीक है। किसी कारण से मैं इस धारणा के तहत था कि सर्वर और क्लाइंट दोनों को स्थानीयहोस्ट पर एक ही बंदरगाहों का उपयोग करना पड़ता था ... – misaochan

+0

@ जोसेफिनलिम बाइंड क्लाइंट सॉकेट पर उपयोग किया जा सकता है, लेकिन यह असामान्य है। – ephemient

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