Wpis z mikrobloga

#programowanie #sieci #siecikomputerowe #jezykc #winsock #socket Hej Mireczki, czy Ktoś z Was ogarnia bibliotekę socket?

Chodzi mi tutaj o podstawową funkcję connect(), czy można ją wykorzystać do tego aby połączyć się z adresem 8.8.8.8 potwierdzając tym samym że mamy dostępne połącznie interenetowe? Gdzieś przeczytałem że to wystarczy - taki prosty PING. Jednak kiedy oglądałem źródła komendy ping.c to tam nie korzystali z connect() tylko od razu po stwqorzeniu socketa dawali send() wysylajac pakiet icmp. Jak zrobić? Chodzi mi tu o szybkie sprawdzenie polaczenia z internetem. czy connect() powinien zadziałać i lepiej coś wysłać send() ?
  • 10
@MamCieNaHita: @gentooman Udało mi się to ogarnąć za pomocą TCP i connect - tylko że tym razem zamiast adresu 8.8.8.8 czyli dns uzyłem jednego z adresów strony googlw.com (216.58.213.0).. tylk otak sie jeszcz zastanawiam, czy nie lepiej by użyć komendy gethostbyname() z paramaterem "www.google.com" i jesli zwóric błąd to oznacza ze nie ma dostepu do sieci?? czy może to zapomocą connect() bedzie szybsze..
@PlugaweWarzywo: gethostbyname prosi systemowy resolver dns żeby rozwiązał nazwę. Jeśli nazwy nie ma w cache to resolver wysyła pakiet UDP do serwera DNS. Resolver też może cachować wyniki, ale tu już nie wiem na jakich zasadach ten cache jest czyszczony, wiec możliwe ze dostaniesz fałszywie pozytywne wyniki, czyli internetu nie ma, ale nazwa jeszcze jest w cache. Dodatkowo twoim serwerem DNS może być twój router który też ma swój cache i
@gentooman: Hej, dzięki za info - tak właśnie było w przypadku "gethostbyname" - gdy odłączyłem kabel nadal dostawalem info ze jestem ONLINE - wiec to zły pomysł.. Generalnie udało mi się zrobić tak jak mówisz - tylko jest jeden problem. Chodzi o czas timeout dla oczekiwania na connect(). Jeśli odłacze kabel to czekam chyba ze 20s. Na Windowsie użyłem TCP_MAXRT w setsockopt(my_socket, IPPROTO_TCP, TCP_MAXRT, (char*)&timeout, sizeof(timeout)); i działało - np. 1
@gentooman: To rozwiazanie zadziałało, działa i na Windowsie i na zupełnie innej platformie, dzieki.. jeszcze ponoć jest inny sposób z użyciem ioctl() SIOCGIFCONF, zeby interfesy sprawdzac jakkie mają flagi, moze taki bylby lepszy bo nie trzeba by sie łączyć z jakimś randomowym serwerem - ale generalnie ten pierwszy mi w zupelnosci wystarcza - ten drogi sproboje zaimplementowac do porowania - jak zadziala to moze jego zostawie
@PlugaweWarzywo: SIOCGIFCONF to ci powie jaki masz adres IP na karcie sieciowej. Jest to za mało żeby stwierdzić czy masz połączenie z internetem. To nawet nie mówi ci czy masz poprawną komunikację z najbliższym routerem, bo przecież te adresy można ustawiać ręcznie i w cale nie muszą być poprawne.

Jedyny sposób na sprawdzenie czy faktycznie masz połączenie z internetem to wysłanie zapytania w ten internet i oczekiwanie że otrzymasz odpowiedź. Zastanów