2010-06-17 13 views
5
import socket, sys 

if len(sys.argv) !=3 : 
print "Usage: ./supabot.py <host> <port>" 
sys.exit(1) 

irc = sys.argv[1] 
port = int(sys.argv[2]) 
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sck.connect((irc, port)) 
sck.send('NICK supaBOT\r\n') 
sck.send('USER supaBOT supaBOT supaBOT :supaBOT Script\r\n') 
sck.send('JOIN #darkunderground' + '\r\n') 
data = '' 
while True: 
     data = sck.recv(1024) 
     if data.find('PING') != -1: 
     sck.send('PONG ' + data.split() [1] + '\r\n') 
     print data 
     elif data.find('!info') != -1: 
      sck.send('PRIVMSG #darkunderground supaBOT v1.0 by sourD' + '\r\n') 


print sck.recv(1024) 

जब मैं इस कोड मैं इस त्रुटि मिलती है ..socket.error: [errno 10054]

socket.error: [Errno 10054] An existing connection was forcibly closed by the remote host

यह कहता है कि त्रुटि पंक्ति 16 में है, डेटा में = sck.recv चलाने (1024)

उत्तर

1

शायद इसका मतलब है कि आप सर्वर के लिए उम्मीद हाथ मिलाना या प्रोटोकॉल विनिमय की आपूर्ति नहीं कर रहे हैं, और यह कनेक्शन बंद हो रहा है।

यदि आप एक ही पाठ में एक ही मशीन और बंदरगाह और प्रकार से टेलनेट क्या होता है?

+0

अपने अजीब कारण यह एक ही कोड से पहले काम करता था, लेकिन मैं सर्वर से पुनः कनेक्ट किया गया और मुझे यह त्रुटि मिलनी शुरू हुई कि मुझे यह भी पता नहीं है कि – SourD

+0

C0d3r: शायद वे सर्वर ने फैसला किया कि यह आपके बॉट को पसंद नहीं आया है, इसलिए अब यह ब्लैकलिस्ट किया गया है। शायद वे कुछ athentication क्रेडेंशियल कि निक के बाद, लेकिन अन्य आदेशों से पहले आवश्यक है जोड़ा? हो सकता है कि कोई पहले से ही निक मिला है, और जब से तुम एक निक के बिना एक चैनल शामिल होने का प्रयास, यह आप डिस्कनेक्ट। वास्तव में, टेलनेट तकनीक कोशिश करते हैं और टाइप एक ही आदेशों - परिणाम स्पष्ट होना चाहिए। –

1

दूरस्थ होस्ट कनेक्शन स्वीकार करने के बाद, एक टीसीपी रीसेट (RST) जारी करने की जाती है। यह कई कारणों में से एक बहुत कुछ के लिए भी हो सकता है जिनमें शामिल हैं:

  • फ़ायरवॉल नियमों
  • रिमोट अनुप्रयोग त्रुटि
  • रिमोट आवेदन बस कनेक्शन बंद कर देता है
  • आदि

के रूप में जॉन वेल्डन ने कहा, उसी मशीन और पोर्ट पर टेलनेटिंग करने का प्रयास करें और मैन्युअल रूप से आदेश दर्ज करें।

इसके अलावा, एक अच्छा तार स्निफर (ईथर, WireShark, आदि) इस तरह की समस्या के निदान के लिए अत्यधिक उपयोगी है।

4

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

इस मामले में पहले सर्वर आप MOTD (दिन के संदेश) दे दिया है एक चैनल शामिल होने का प्रयास सर्वर द्वारा एक वियोग का कारण होगा। एमओटीडी प्रोटोकॉल कोड का अंत 376 है और इंगित करता है कि आईआरसी कनेक्शन अनुक्रम खत्म हो गया है, और आप अपने आईआरसी सत्र के साथ आगे बढ़ सकते हैं जैसे: आदेश दर्ज करें (जैसे शामिल हों)।

मैं एक Recv पाश में प्रवेश करने और इससे पहले कि आप निगरानी आईआरसी कोड 376 के लिए सर्वर से प्राप्त डेटा सुझाव है कि एक चैनल में शामिल होने का प्रयास करते हैं, पर्ल में यह इस तरह somthing दिखेगा:

sub chan_join{ 
    while(my $input = <SOCK>){ 
    if($input =~ /376/){ 
     my $talk = "JOIN $channel"; 
     &send_data($talk); 
     &monitor; 
    } 
    else { print "$input"; } 
    } 
} 

सुंदर गरीब लेकिन आपको सही विचार मिल गया है? (कृपया एक बार 376 के लिए जाँच करने के लिए अपने ही आवश्यक ध्यान दें, एक बार देखा आप जुड़े हुए हैं और आप केवल 'PING के सर्वर का जवाब देने से कनेक्शन को बनाए रखने की जरूरत है)

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