Pomoc w konwersji kodu z Python

0

Witam, potrzebuję pomocy w zrozumieniu i konwersji tego kodu:

 
    AUTODISCOVER_MESSAGE = b''
    AUTODISCOVER_ADDR = b'<broadcast>'
    AUTODISCOVER_PORT = 28000
    AUTODISCOVER_TIMEOUT = 3
    def discoverHosts(self, addr = AUTODISCOVER_ADDR, port = AUTODISCOVER_PORT, timeout = AUTODISCOVER_TIMEOUT):
        # Otwiera UDP socket 
        dis_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
        dis_sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
        dis_sock.settimeout(timeout)
        dis_sock.sendto(self.AUTODISCOVER_MESSAGE, (addr, port))
        retval = list()
        try:
            while True:
                data, addr = dis_sock.recvfrom(1024)
                if len(data) > 0:
                    try:
                        resp_data = json.loads(data.decode('utf-8'))
                        resp_data['addr'] = addr[0]
                        retval.append(resp_data)
                        print('Host found: ', resp_data)
                    except:
                        print('Received bogus data from ', addr)
                else:
                    print('Received bogus data from ', addr)
        except:
            pass
        dis_sock.close()
        return retval

Niestety nie mogę ogarnąć tego, próbowałem przejrzeć dokumentację C#, ale nic nie przychodzi mi do głowy.

0

Ale z czym masz problem? Z utworzeniem socketa, wysłaniem datagramu, odebraniem danych, deserializacja z JSONa? Co już próbowałeś zrobić? :|

0

Udało mi się coś takiego napisać:
byte[] data = new byte[1024];
string input, stringData;
IPEndPoint ip = new IPEndPoint(IPAddress.Parse("192.168.0.102"), 28000);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
string AUTODISCOVER_ADDR = "<broadcast>";
data = Encoding.ASCII.GetBytes(AUTODISCOVER_ADDR);
server.SendTo(data, data.Length, SocketFlags.None, ip);
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)sender;
data = new byte[1024];
int receivedDataLength = server.ReceiveFrom(data, ref Remote);
Console.WriteLine(Encoding.ASCII.GetString(data, 0, receivedDataLength));
server.Close();
Console.Read();

I niby to działa, ale teraz mam kolejny problem. Aplikacja wysyła dane na port 27000, chciałem je odebrać. Użyłem narzędzia SocketTest 3.0 
![user image](http://wrzuc.se/images/565cbd2ee9130.png) 
Jednak nie wiem jak to przenieś na C# Próbowałem postawić socketa, ale wywala mi błąd z odmową połączenia
0

Istniejące połączenie zostało gwałtownie zamknięte przez zdalnego hosta

0

Przecież w źródle masz port 28000, a nie 27000, więc czego się spodziewasz ?

0

Ogólnie to najpierw na porcie 28000 odbiera dane o statusie aplikacji, a później na 27000 przesyła je. Teraz zostało mi tylko odebrać dane na porcie 27000, które przesyła aplikacja. Jednak jak próbowałem postawić socketa i się połączyć to odrzuca, jednak jak użyłem programu SocketTest to program jakoś to połączył, tak samo telnet też się połączył na tym porcie, a moja aplikacja nie może.

0

Już sobie poradziłem ;) Temat można zamknąć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1