Forum Linux.pl

Programowanie => Języki skryptowe => Wątek zaczęty przez: 920806 w 2017-02-20, 11:37:40

Tytuł: [python] problem z polaczeniem servera z klientem
Wiadomość wysłana przez: 920806 w 2017-02-20, 11:37:40
Witam,

Napisałem 2 skrypty przy pomocy modulu socket.
Jeden z nich pełni role serwera,a drugi klienta(wszystko na jednym komputerze).

Server nasłuchuję na porcie 8989,pod adresacja 127.0.0.1
Klient ma sie podłączyć pod ten adres, no i w sumie to robi.



Ale gdy chce zmienić adres ip server na np. 192.168.1.10 otrzymuje komunikat:
OSError: [Errno 99] Cannot assign requested adress.
Wszystkie skrypty odpalam przez python 3.5

Ostatecznie chciał bym osiągnąć komunikacje miedzy dwoma komputerami ..ale czy jak podam adres pętli zwrotnej na jednym komputerze to klient na drugim nie będzie próbował sie komunikować ze swoja własną pętlą? To bez sensu ,z drugiej strony jak wskazać serwer klientowi jeśli nie moge mu przypisać innej adresacji ..jesli trzeba udostępnię kod :)
Tytuł: Odp: [python] problem z polaczeniem servera z klientem
Wiadomość wysłana przez: Paweł Kraszewski w 2017-02-20, 15:59:09
jesli trzeba udostępnię kod :)

No, trzeba. Z informacją o adresacji obu komputerów.
Tytuł: Odp: [python] problem z polaczeniem servera z klientem
Wiadomość wysłana przez: 920806 w 2017-02-20, 17:46:22
Żeby nie mieszać ..Zmieniłem adresację na tę działającą

Serwer:

import socket
#
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
adres_s = ("127.0.0.1",8989)
s.bind(adres_s)
s.listen(5)
 
while True:
    c,a = s.accept()
    print("Odpowiedź z:",a)
    c.send("Hello",a[0])
    s.close()

klient:
import socket
 
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 
adres= ("127.0.0.1",8989)
 
s.connect(adres)
 
s.send("HELLO".encode('utf-8'))
 
s.close()


W przypadko drugiego komputer zapomniałem uwzględnić 1 ważny szczegół .. komputer działa pod Windowsem ..:/. Post pisałem w pracy :( ..|

adresacja :
komputer1 linux(serwer)

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       
inet 192.168.1.3  netmask 255.255.255.0  broadcast 192.168.1.255


komputer 2 (klient)
 Adres IPv4. . . . . . . . . . . . . : 192.168.1.2(Preferowane)
 Maska podsieci. . . . . . . . . . : 255.255.255.0
 Brama domyślna. . . . . . . . . . : 192.168.1.1
 Serwer DHCP . . . . . . . . . . . : 192.168.1.1
 Serwery DNS . . . . . . . . . . . : 192.168.1.1
Tytuł: Odp: [python] problem z polaczeniem servera z klientem
Wiadomość wysłana przez: Paweł Kraszewski w 2017-02-20, 18:14:35
Nie widzę, żeby któryś z komputerów miał adres 192.168.1.10. Serwer musi słuchać na którymś z adresów przypisanych komputerowi na którym działa, albo na specjalnym adresie 0.0.0.0 (IPv4)/::0 (IPv6) oznaczającym słuchanie na wszystkich dostępnych interfejsach.
Tytuł: Odp: [python] problem z polaczeniem servera z klientem
Wiadomość wysłana przez: 920806 w 2017-02-20, 18:59:54
Po zmianie adresacji , dostaję taki komunikat
 
s.connect(adres)
OSError: [WinError 10049] Żądany adres jest nieprawidłowy w tym kontekście

Po wyłączenie zapory ten sam komunikat , nie wiem gdzie powienienem zacząć szukać .. Cały skrypt jest oparty o kod z dokumentacji ...

Tak przy okazji , czy dane przesyłane przez klienta są określne i serwer sprawdza co się mu wysyła ?
mam na myśli sytuacje,gdy nie użyje metody get w metodzie send(),a raczej zwykły tekst np. Hello Word
Tytuł: Odp: [python] problem z polaczeniem servera z klientem
Wiadomość wysłana przez: Paweł Kraszewski w 2017-02-21, 13:21:34
Błąd 10049 znaczy, że serwer próbuje otworzyć usługę na IP nie należącym do komputera, na którym jest ona uruchamiana.

Ponawiam:
 Jeżeli serwer ma przypisane następujące adresy: 127.0.0.1 (loopback) i a.b.c.d (karta sieciowa), to Pythonowy bind możesz zrobić tylko do adresów '127.0.0.1', 'a.b.c.d' i '' (pusty string). Bind do jakiegokolwiek innego adresu zwróci błąd, akurat 10049 w przypadku Windowsa.
Tytuł: Odp: [python] problem z polaczeniem servera z klientem
Wiadomość wysłana przez: 920806 w 2017-02-21, 17:06:06
Temat można zamknąć,Działa pięknie ..:)

Błąd polegał w złym adresie ip klienta , myślałem że należy podać w argumencie adres ip który podałem w metodzie bind() serwera... Ktoś mądry mi podpowiedział i należy podać adres IP maszyny, na której jest odpalony serwer , a sam serwer zostanie odnaleziony po numerze portu.. Nie wiem dla czego to mi uciekło :)

Tytuł: Odp: [python] problem z polaczeniem servera z klientem
Wiadomość wysłana przez: Paweł Kraszewski w 2017-02-21, 17:47:52
o.O

Z czystej, dydaktycznej ciekawości: co dawałeś klientowi zamiast adresu serwera świadczącego usługę?
Tytuł: Odp: [python] problem z polaczeniem servera z klientem
Wiadomość wysłana przez: 920806 w 2017-02-21, 19:12:07
Odpowiedź jest w kodzie wyżej :). Albo 127.0.0.1 ,albo 0.0.0.0 ale nie wpadłem na to żeby podać adres ip komputera ... Dla tego trybiło na Linuxie , bo klienta odpalałem w drugiej karcie terminala na tej samej maszynie.

Ahhh.. brakło koncentracji i wiedzy ..2 dni zmarnowane :) Zapamiętam do końca życia