2011-08-18 9 views
5

Zdaję sobie sprawę, że to pytanie jest podobne: tosomeothers, ale doszedłem do wniosku, że moja sytuacja jest wystarczająco odmienna, aby uzasadnić własne pytanie (miejmy nadzieję).Nawiąż połączenie P2P w języku C#

Planuję wdrażanie programu na komputerze innej osoby, który otworzy połączenie z moim komputerem, po czym, zakładam, komputery powinny być w stanie komunikować się ze sobą. Po uruchomieniu programu powinno być możliwe pobranie informacji o adresie i porcie (jeśli nie są zablokowane) w celu utworzenia połączenia, prawda?

Co więcej, konfiguracja internetowa akademika w którym mieszkam. Każdemu pokojowi przypisany jest unikalny port i statyczny adres IP przydzielony przez serwer DHCP. Jak mogę to uwzględnić w projekcie mojego programu?

Myślę, że ta konfiguracja nie wymaga serwera jako pośredniego punktu dostępu, ponieważ moje dane adresowe zawsze pozostaną takie same, a komputer-host może po prostu połączyć się z moim komputerem bez dodatkowych informacji. Czy to jest poprawne?

Wreszcie, czytam kilka stron o tworzeniu połączenia, ale jestem mylony ze wszystkimi możliwościami TcpConnection, WCF, CORBA itp. Który z nich byłby najprostszy dla mnie, zaczynając od założenia, że ​​chcę tylko wysłać wiadomości do drugiego komputera?

Aktualizacja:

adres jest statyczny w tym sensie, że nie zmienia się. Mój adres IP ma postać 130.83.20.xxx i mogę poczekać, aż serwer DHCP przydzieli mi ten adres, lub mogę ręcznie wprowadzić go przy użyciu statycznej konfiguracji IP.

Jeśli chodzi o same wiadomości, na początek wystarczą zwykłe wiadomości tekstowe. Wspomniane wcześniej porty są portami przełączników i nie wchodzą w grę podczas programowania sieciowego.

+0

Aby Cię poprowadzić, musimy dowiedzieć się więcej o Twoim celu. W zależności od charakteru danych, które należy wysłać, TcpConnection może być dobry, ale może wtedy prosta usługa WCF byłaby lepsza. Nie rozumiem, o co ci chodzi, kiedy mówisz, że do każdego pokoju przypisany jest port i statyczny adres IP ... masz na myśli fizyczny port, jeśli tak, to nie wchodzi w grę podczas programowania sieciowego. Porty TCP/UDP są jednak ważne. Będziesz potrzebował portów, które są dostępne do Twojego użytku. – Nate

+0

@Nate: Dzięki za heads up. Na razie chcę tylko przetestować ten program na komputerze przyjaciela i myślę, że proste wiadomości tekstowe, takie jak "Cześć, jak się masz?" powinno być dobrze. Na przykład mój adres IP to 130.83.20.103 lub coś w tym stylu. To się nie zmienia. Serwer DHCP przypisuje mi ten adres lub mogę go wprowadzić ręcznie. Każdy pokój ma port, który może być blokowany przez centralną administrację IT. Są to chyba porty przełączników. – IAE

+0

Jeśli serwer DHCP może przypisać ci adres IP '130.83.20.103', nie powinieneś ręcznie konfigurować siebie, aby mieć ten adres IP. Jeśli tak zrobisz, a serwer DHCP przydzieli ten adres innej osobie, skończy się to konfliktem adresu IP, a także skutecznym atakiem typu "odmowa usługi" skierowanym przeciwko biednemu frajerowi, któremu przydzielono ten adres IP przez serwer DHCP. – Justin

Odpowiedz

5

Chciałbym iść z TcpClient i TcpListener. Sprawdź przykładowy kod na MSDN, skopiuj i wklej go do dwóch projektów konsoli C# i zbuduj je.

Do testowania używałbym 127.0.0.1 (localhost) na porcie 5001 (powszechnie używany port testowy).

TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 5001); 

Następnie powinieneś być w stanie przetestować prosty klient/serwer, który działa tylko na twoim komputerze. Gdy już to zrobisz, możesz zabrać klienta na inny komputer w akademiku i upewnić się, że nadal działa. Gdy to zadziała, możesz udać się do lokalnej kawiarni i zabrać klienta ze sobą. Pozostaw serwer działający pod znanym adresem IP w twoim akademiku. W takim przypadku należy powiązać serwer z faktycznym zewnętrznym adresem IP (nie localhostem). Można to zrobić tylko przez określenie portu do konstruktora TcpListener: `

TcpListener server = new TcpListener(5001); 

Po uzyskaniu wszystkich, że pracując samodzielnie lub z przyjacielem, a następnie wysłać go zewnętrzny. Lepiej, aby te rzeczy działały w wersji demo, zanim wyślesz je do swojego klienta i sprawisz, że będzie z tobą rozwiązywał problemy. :)

Rozumowanie moją odpowiedź:

Simple TCP klient/serwer jest bardzo prosta i pozwoli prosty czat programu pomiędzy dwoma komputerami. Następnie możesz go podnieść, aby wysłać dowolny strumień danych, który chcesz.Możesz dodać kod w taki sposób, aby uzyskać dostęp do StreamWriter:

NetworkStream stream = client.GetStream(); 
StreamWriter writer = new StreamWriter(stream); 
+1

Czy istnieje limit przesyłania dużych plików? – whihathac

+0

Niezupełnie. Po prostu zaimplementujesz metody pobierania/pobierania na swoich serwerach i klasach klienckich, a w tych metodach będziesz przesyłać bloki danych do pliku. Więc nie wysyłasz wszystkich danych naraz. Po prostu wyślij 1K na raz. W tym momencie możesz przejść do projektowania protokołu, jeśli chcesz zaimplementować potwierdzenia, weryfikację integralności danych itp. Ale na poziomie podstawowym po prostu czytasz ze strumienia sieciowego i piszesz do strumienia plików i na odwrót po drugiej stronie . Bez ograniczeń (poza limitem strumienia plików, np. Z limitem rozmiaru pliku 4GB FAT32). – mattypiper