الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة في برنامج Simple Gopher Client

بدأه SalehZubir في 18 أبريل 2010 · 5 رد · 753 مشاهدة · في لغة Python
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

لدي مشكلة في البرنامج التالي

import socket, sys

port = 70 #Gopher user port 70
host = sys.argv[1]
filename = sys.argv[2]

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((host,port))

s.sendall(filename + "\r\n")

while 1:
    buf = s.recv(2048)
    if not len(buf):
        break
    sys.stdout.write(buf)

المثال مأخوذ من كتاب Foundations of Python Network Programming وهو عبارة عن Simple Gopher Client عندما حاولت ان اقوم بتنفيذ المثال طبعاً بعد حفظه بأسم gopherclient.py لم استطع وكانت تظهر لي رسالة الخطاء التالية

Traceback (most recent call last):
  File "C:\Users\WVHPA\Desktop\PIN\gopherclient.py", line 4, in <module>
    host = sys.argv[1]
IndexError: list index out of range

السؤال الاول : كيف يمكن حل مشكلة هذا الخطاء

السؤال الثاني : هل من احد الاخوة ان يشرح اكواد البرناج لأنه لا يوجد في الكتاب سوى الية عمل البرنامج والحمد لله هذي بسيطة وواضحة وقد وضعتها في النص التالي لمن يريد ان يطلع عليها

اقتباس

This program takes two command-line arguments: a hostname and a filename,

and requests the appropriate document from the host.

It creates a socket with the call to socket.socket().

The arguments tell the system thar it wants an internet socket for stream (TCP) communication.

then the program connects to the remote host and transmits

the filename.Finally,it reads back the response and print it to the screen

واعتذر عن الاطالة في الحديث

وجزاكم الله كل خير

#2

ازاى شغلته طيب ؟ البرنامج واضح انه بياخد معاملات من سطر الأوامر بالإضافة للبرنامج نفسه

python gopherclient.py HOST FILE
(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#3

انا كنت كاتب البرنامج على IDLE وبعدين Run وبعدين Run Model عشان يشتغل معي زي اي برنامج بايثون كنت اكتبة اول

وايش تقصد بي

اقتباس
البرنامج واضح انه بياخد معاملات من سطر الأوامر بالإضافة للبرنامج نفسه

وايش تقصد بي

اقتباس

python gopherclient.py HOST FILE

#4

شغله من سطر الأوامر بنفس الطريقة اللى كتبتها لان idle مش بتشمل وسيلة اعرفها لتحديد معاملات البرنامج

HOST هو اسم الهوست

FILE هو الفايل المطلوب

اما عن طريقة العمل

انت بتنشئ Socket لعملية تبادل البيانات TCP

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

اول معامل هو الaddress family والتانى هو نوع السوكيت

s.connect((host,port))

الإتصال بالهوست على بورت ما (وهو 70)

s.sendall(filename + "\r\n")

ارسال اسم الملف المطلوب

while 1:
    buf = s.recv(2048)
    if not len(buf):
        break
    sys.stdout.write(buf)

الحصول على المحتوى فى لوب للملف وطباعته لل stdout

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#5

اولاً اعتذر عن ردي المتأخر

ثانياً حاولت تنفيذ البرنامج من خلال Python Command Line و ايضاً من خلال الـ CMD

بستخدام العبارة

اقتباس

python gopherclient.py HOST FILE

ولكن كل المحاولات بائت بالفشل مما جعلني انتقل للعمل على احد توزيعات لينكس وهي الـ BackTrack4 وحاولت تشغيل البرنامج من خلال ال Terminal بعد تنصيب الـ Python بستخدام نفس العبارة ولكن لم ينفذ البرنامج وظهرت لي الرسالة التالية

اقتباس

Traceback (most recent call last):

File "gopherclient.py", line 8, in <module>

s.connect((host,port))

File "<string>", line 1, in connect

socket.gaierror: (-5, 'No address associated with hostname')

ارجوا التوضيح وجزاكم الله كل خير

#6

لتغشيله على الوندوز من سطر الاوامر تحتاج اضافة مسار تنصيب البايثون الى PATH او تشغيل بايثون عبر تحديد مسارها الكامل:

c:\python26\python.exe myfile.py arg1 arg2 ...

بالنسبة للـ arguments واضح ان HOST ليس هو المعامل اللذي تريد ادخاله للبرنامج و انما الاخ احمد يقصد توضيح ما هية المعاملات،

يعني يجب ان تستخدم عنوان حقيقي بدل HOST و كذلك اسم ملف حقيقي بدل FILE

مواضيع مشابهة