Adres internetowy klasa wxipv4address - wymaga #include <wx/socket.h> Najważniejsze metody: bool Hostname(const wxstring& hostname) ustawia nazwę domenową hosta lub adres IP w notacji kropki: a.b.c.d bool Hostname() zwraca nazwę domenową hosta, gdy zna jego adrees IP wxstring IPAddress() zwraca adres IP hosta w notacji kropki: a.b.c.d, gdy zna jego nazwę domenową bool Service(const wxstring& service) ustawia wybraną usługę, tzn numer portu zwiazanego z usługą bool Service(unsigned short) - ustawia numer portu związanego z usługą. unsigned short Service() - zwraca numer portu związanego z usługą. Przykład Podaj nazwę domenową hosta a odczytaj jego adres IP, lub odwrotnie: wxipv4address h; // obsługa zdarzenia OnEnter komponentu WxEdit1 h.hostname(wxedit1->getvalue()); wxstring ip = h.ipaddress(); WxEdit2->SetValue(ip); // obsługa zdarzenia OnEnter komponentu WxEdit2 h.hostname(wxedit2->getvalue()); wxstring nazwa = h.hostname(); WxEdit1->SetValue(nazwa); // podajesz nazwę hosta jako wxstring // odczytujesz adres IP jako wxstring w notacji kropki // podajesz nazwę hosta jako adres IP w notacji kropki // odczytujesz nazwę domenową jako wxstring Aby odczytać lokalny adres IP mojego komputera, najprościej spróbować połączyć się z jakimś serwerem: utworzyć gniazdo klienckie, połączyć się i odczytać parametry lokalnego adresu. wxipv4address lokalny; h.service(80); wxsocketclient klient; // wxipv4address h; jak wyżej // ustaw port dla usługi serwera, np. 80 dla HTTP // utwórz gniazdo klienta if (klient.connect(h)) klient.getlocal(lokalny); int port = lokalny.service(); // klient łączy się // można odczytać adres IP lokalnego gniazda // w tym: numer portu komunikacyjnego WxStaticText5->SetLabel(lokalny.IPAddress()+" : "+ wxstring::format("%i",port)); W przykładzie zastosowano klasę wxsocketclient, służącą do tworzenia gniazd komunikacyjnych. Jej metody: Connect(wxSockAddress& addr) - nawiązuje połączenie z podanym adresem IP. GetLocal(wxSockAddress& addr) zwraca lokalny adres IP oraz numer portu komunikacyjnego. Klasa wxsockaddress jest klasą bazową dla wxipaddress, a ta jest bazową dla wxipv4address.
wxurl klasa pochodna od wxuri, stosowana do pobierania danych z URI (Uniform Resource Identifier). Dane są pobierane za pomocą strumienia obiektu klasy wxinputstream. Należy: podać adres zasobu zainicjować strumień odczytać rozmiar zasobu w bajtach pobrać ze strumienia wskazaną liczbę bajtów do bufora tekstu lub do obrazu #include <wx/url.h> // ładowanie tekstu z url void Okno::WxButton1Click(wxCommandEvent& event) { wxurl adres = WxEdit1->GetValue(); if (adres.geterror() == wxurl_noerr) { wxinputstream *wejscie = adres.getinputstream(); //można w 2 krokach: wxinputstream *wejscie ; wejscie = adres.getinputstream(); int rozmiar = wejscie->getsize(); char *c = new char [rozmiar]; wejscie->read(c,rozmiar); c[rozmiar] = \0 ; WxEdit2->SetValue(c); delete c; // odczyt rozmiaru zasobu // przygotowanie bufora danych // pobieranie danych // zakończenie łańcucha danych // ładowanie obrazka z url void Okno::WxButton2Click(wxCommandEvent& event) { wxurl adres = "http://"+wxedit3->getvalue(); if (adres.geterror() == wxurl_noerr) { wxinputstream *wejscie = adres.getinputstream(); int rozmiar = wejscie->getsize(); // odczyt rozmiaru zasobu WxStaticText4->SetLabel(wxString::Format("%i",rozmiar)); wxinitallimagehandlers(); wximage obraz = wximage(*wejscie, wxbitmap_type_png); // pobór danych wxclientdc g(this); g.drawbitmap(obraz,300,100); trzeba określić format graficzny pliku!
wxftp obiekt tej klasy umozliwia nawiązanie połaczenia z serwerem FTP, zalogowanie użytkownika i wykonywanie podstawowych operacje na katalogach i plikach: wxftp::chdir wxftp::mkdir wxftp::rmdir wxftp::pwd wxftp::rename wxftp::rmfile wxftp::setuser wxftp::setpassword wxftp::fileexists wxftp::getfilesize wxftp::getdirlist wxftp::getfileslist wxftp::getoutputstream wxftp::getinputstream Przykład Nawiązanie połaczenia, przejście do podkatalogu, lista zawartości katalogu, pobranie pliku index.html #include <wx/protocol/ftp.h> wxftp f; f.setuser("rpluta"); f.setpassword("password"); if ( f.connect("student.zsl.gda.pl") ) { // parametry logowania // łączenie z serwerem if ( f.chdir("/www") ) { // przykład operacji na katalogach: przejdź do podkatalogu www wxarraystring A; // pobranie zawartości bieżącego katalogu z serwera if (f.getfileslist(a)) WxListBox1->Set(A); // i wyświetlenie w kontrolce WxListBox1 wxstring plik = "index.html"; int rozmiar = f.getfilesize(plik); // odczyt rozmiaru pliku wxinputstream *in = f.getinputstream(plik); // inicjacja strumienia char *data = new char[rozmiar]; if (!in->read(data, rozmiar) ) WxEdit1->SetValue( błąd ); // pobranie danych else WxEdit1->SetValue(data); delete [] data;
Podsumowanie strumieni binarnych Strumienie - służą do ujednolicenia operacji we/wy na różnych platformach. Podstawowe klasy: wxstreambase, wxstreambuffer, wxinputstream, wxoutputstream, klasy dla obsługi konkretnych rodzajów we/wy wxsocketin/outputstream, wxdatain/outputstream, wxfilein/outputstream Konstruktor strumienia inicjuje bufor danych i otwiera dostęp do pliku. // z zasobu URL wxurl adres = http://rpluta.student.zsl.gda.pl/robol.txt ; wxinputstream *wej = adres.getinputstream(); int rozmiar = wej->getsize(); char *dane = new char [rozmiar]; wej->read(dane,rozmiar); // użyj dane delete [] dane; // odczytaj rozmiar zasobu w bajtach // dane tekstowe wximage obraz = wximage(*wej,wxbitmap_type_bmp,-1); // dane graficzne wxclientdc g(this); // typ grafiki trzeba określić! g.drawbitmap(obraz,300,100); // z serwera FTP wxftp f; // f.setuser(), f.setpassword(), f.connect(serwer) int rozmiar = f.getfilesize(plik); wxinputstream *wej = f.getinputstream(d); char *dane = new char[rozmiar]; if (!wej->read(dane, rozmiar) ) wxlogerror("read error"); else // użyj dane delete [] dane; // z pliku lokalnego binarnego (nie tekstowego): czytanie i zapis wxfileinputstream wejscie("plik"); wejscie.read(&data, rozmiar); wxfileoutputstream wejscie("plik"); wejscie.write(&data, rozmiar); Dluznik d; std::vector <Dluznik> D; wxfileinputstream wejscie("baza.aaa"); int i=0; int rozmiar = sizeof(d); while (!wejscie.eof()) { wejscie.read(&d,rozmiar); if (strlen(d.ksywa)>0) { WxListBox1->Append(d.ksywa); D.push_back(d); i++; wxfileoutputstream wyjscie("baza.aaa"); int rozmiar = sizeof(d); for (int i=0; i<d.size(); i++) wyjscie.write(&d[i],rozmiar); wyjscie.close(); class Dluznik { public: char ksywa[20]; wxstring ks = WxEdit1->GetValue(); double kwota; strcpy(d.ksywa, ks.c_str());