it-swarm.asia

socket.error: [errno 99] لا يمكن تعيين العنوان المطلوب ومساحة الاسم في python

يقول برنامج الخادم الخاص بي errno99: cannot assign requested address أثناء استخدام عنوان IP غير 127.0.0.1 للتجليد.

ولكن إذا كان عنوان IP هو 127.0.0.1 فهو يعمل. هل هو مرتبط بمساحات الأسماء؟

أقوم بتنفيذ أكواد الخادم والعميل الخاصة بي في برنامج آخر python program عن طريق الاتصال بـ execfile(). أنا أعدل فعليًا شفرة مصدر mininet. لقد قمت بتحرير net.py وداخله كنت أستخدمه execfile ('server.py') execfile ('client1.py') و execfile ('client2.py'). بمجرد استدعاء "Sudo mn --topo single، 3" مع إنشاء 3 مضيفين سيتم تنفيذ رموز الخادم والعميل. لقد قدمت رموز الخادم والعميل الخاصة بي أدناه.

#server code
import select 
import socket 
import sys 
backlog = 5 
size = 1024 
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server.bind(("10.0.0.1",9999)) 
server.listen(backlog) 
input = [server] 
running = 1 
while running: 
    inputready,outputready,exceptready = select.select(input,[],[]) 
    for s in inputready: 
        if s == server: 
            client, address = server.accept() 
            input.append(client)
        else: 
            l = s.recv(1024)
            sys.stdout.write(l)
server.close()


#client code
import socket
import select
import sys
import time
while(1) :
    s,addr=server1.accept()    
    data=int(s.recv(4))
    s = socket.socket()
    s.connect(("10.0.0.1",9999))
    while (1):
        f=open ("hello1.txt", "rb")
        l = f.read(1024)
        s.send(l)
        l = f.read(1024)
        time.sleep(5)
s.close()
24
user2833462

تجريد الأشياء إلى الأساسيات ، هذا هو ما تريد اختباره باستخدام:

import socket
server = socket.socket() 
server.bind(("10.0.0.1", 6677)) 
server.listen(4) 
client_socket, client_address = server.accept()
print(client_address, "has connected")
while 1==1:
    recvieved_data = client_socket.recv(1024)
    print(recvieved_data)

هذا يعمل بافتراض بعض الأشياء:

  1. عنوان IP المحلي الخاص بك (على الخادم) هو 10.0.0.1 ( يوضح لك هذا الفيديو كيف )
  2. لا توجد برامج أخرى تستمع على المنفذ 6677

لاحظ أيضًا المفهوم الأساسي لعناوين IP:

جرب ما يلي ، افتح قائمة البدء ، في نوع الحقل "بحث" cmd واضغط على إدخال. بمجرد فتح وحدة التحكم السوداء ، اكتب ping www.google.com وهذا يجب أن يمنحك وعنوان IP لجوجل. هذا العنوان هو googles IP المحلي وهم يرتبطون بذلك ومن الواضح أنه يمكنك عدم الربط بعنوان IP الذي تملكه google.

مع وضع ذلك في الاعتبار ، فأنت تمتلك مجموعة عناوين IP الخاصة بك. أولاً لديك IP المحلي للخادم ، ولكن بعد ذلك لديك IP المحلي لمنزلك. في الصورة أدناه 192.168.1.50 هو عنوان IP المحلي للخادم الذي يمكنك ربطه. لا تزال تملك 83.55.102.40 ولكن المشكلة هي أنها مملوكة من قبل الموجه وليس لخادمك. لذلك حتى إذا قمت بزيارة http://whatsmyip.com والتي تخبرك بأن عنوان IP الخاص بك هو 83.55.102.40 فهذا ليس هو الحال لأنه يمكن أن يرى فقط من أين أنت. وأنت تقوم بالوصول إلى الإنترنت الخاص بك من جهاز التوجيه.

enter image description here

لكي يتمكن أصدقاؤك من الوصول إلى الخادم الخاص بك (والذي يرتبط بـ 192.168.1.50) ، يلزمك إعادة توجيه المنفذ 6677 إلى 192.168.1.50 ويتم ذلك في جهاز التوجيه الخاص بك. على افتراض أنك تقف وراء واحد.

إذا كنت في المدرسة ، فهناك معضلات وموجهات أخرى في الطريق على الأرجح.

29
Torxed

جرب مثل هذا: server.bind (("0.0.0.0" ، 6677))

4
WindyYang

عندما تربط localhost أو 127.0.0.1 ، هذا يعني أنه يمكنك فقط الاتصال بخدمتك من المحلية.

لا يمكنك الربط 10.0.0.1 لأنه ليس ملكًا لك ، يمكنك فقط ربط ip يملكه جهاز الكمبيوتر الخاص بك

يمكنك الربط 0.0.0.0 لأنه يعني كل بروتوكول الإنترنت على جهاز الكمبيوتر الخاص بك ، بحيث يمكن لأي عنوان IP الاتصال بالخدمة الخاصة بك إذا كان بإمكانهم الاتصال بأي من IP الخاص بك

0
pumpkindle