Jak połączyć się za pomocą Socketów w C++ do komputera znajdującego się w sieci lokalnej ?

0

Mam taki oto program:

#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/wait.h>
#include <iostream>
#include <arpa/inet.h>

#define MYPORT 9999
#define BACKLOG 10

using namespace std;
int main( void ) {
    int sockfd, new_fd;
    struct sockaddr_in my_addr;
    struct sockaddr_in their_addr;
    socklen_t sin_size;
    
    sockfd = socket( AF_INET, SOCK_STREAM, 0 );    
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons( MYPORT );
    my_addr.sin_addr.s_addr = INADDR_ANY;
    memset( &( my_addr.sin_zero ), '\0', 8 );
    
    while(1) {
      bind( sockfd,( struct sockaddr * ) & my_addr, sizeof( struct sockaddr )); 
      listen( sockfd, BACKLOG );
      sin_size = sizeof( struct sockaddr_in );
      new_fd = accept( sockfd,( struct sockaddr * ) & their_addr, & sin_size );
      cout<<"Connected with "<<inet_ntoa(their_addr.sin_addr)<<"!"<<endl;
      
      char msg[256] = {0};
      while(1) {
	if( (recv(new_fd, msg, 256, 0) ) > 0 ) {
	  cout<<msg<<endl;
	  break;
	}
      }
      close(new_fd);
    }
    
    return 0;
}
 

Gdy go odpalę, a następnie wpiszę w oddzielnej konsoli:
telnet 192.168.1.4 9999
Program zasygnalizuje połączenie oraz wyświetli wiadomość jeśli jakąś w konsoli z odpalonym telenetm napiszę.

Wszystko działa dobrze gdy program oraz telnet są włączane na jednym komputerze, ale gdy program odpalam na jednym, a telnet na drugim komputerze znajdującym się w tej samej sieci wifi, to połączenie się nie nawiązuje. Czy da się w ogóle połączyć w ten sposób (tj. program włączony na jednym komputerze, a telnet na drugim, gdzie oba znajdują się w tej samej sieci wifi) ? Jak to zrobić jeśli się da ?

1

Oczywiście, że się da. Nie widzę błędu w kodzie, zresztą napisałeś że działa na localhost. Widzę, że nie używasz windowsa więc odpada też problem jakiś dziwnych windowsowych firewalli. Najpierw sprawdź czy możesz pingnąć maszynę do której chcesz się podłączyć - jeśli nie możesz to masz odpowiedź dlaczego nie możesz się połączyć telnetem. Jeśli możesz to zostaje Ci chyba już tylko sniffer i sprawdzenie w którym miejscu pakiety "się gubią".

edit
Może to też być spowodowane przez jakieś dziwne blokowanie na ruterze, ale to raczej mało prawdopodobne. Gdy łączyłeś się z lokalnej maszyny nie używałeś pętli zwrotnej tylko adresu w sieci, także zapytanie musiało przejść przez ruter. Tak samo jak w przypadku zapytania z innej maszyny tyle że nadawca jest inny. Dlatego to teoretyczne blokowanie na ruterze byłoby dziwne, bo nie spotkałem jeszcze tak wykręconej konfiguracji, z tymże w tej branży wszystko jest możliwe ;)

0

Dlaczego wywolujesz bind() i listen() w petli? + Czemu nie sprawdzasz czy te wywolania sie powiodly? :|

0

Faktycznie nie mogę pingnąć. Poszukam rozwiązania, ale wkleję też tu to, co wyskakuje, może znasz rozwiązanie, lub ktoś inny kto to będzie czytał zna: http://scr.hu/1wwz/7lr95

No, to teraz zaczyna się zabawa ;) Zrób dodatkowe testy - spwrawdź czy z tej maszyny możesz pingnąć cokolwiek, np www.wp.pl. Potem sprawdź czy maszyny do której chcesz się podłączyć możesz pingnąć maszynę z której chcesz się podłączyć telnetem. To powinno dać kolejne wskazówki.

Taka rada, w przypadku rozwiązywania problemów z połączeniem w sieci ten prosty ping to bardzo przydatne narzędzie, protokół ICMP jest dość nisko w hierarchi osi/iso przez co dostajemy całkiem przydatne informacje.

1

Mogę pingnąć www.wp.pl Mogę również pingnąć routera tj. 192.168.1.1

Udało mi się rozwiązać problem patrząc na pierwszą odpowiedź z tej stronki: http://superuser.com/questions/453933/pinging-a-machine-on-my-local-network-gets-an-unreachable-response-from-my-own
Musiałem po prostu wyłączyć izolację klientów.

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