czwartek, 28 maja 2009

Serwer

Sesja zbliża się wielkimi krokami, trza zabrać się do pracy :) Oczywiście to co najnudniejsze automatycznie spada na sam koniec listy rzeczy do zrobienia i tym sposobem zabrałem się za pisanie zadanka z sieci. Zaopatrzywszy się w odpowiednie zaplecze teoretyczne, włączyłem muzykę...




... i przepisałem kawałek kodu z książki ;)

#include <sys/types.h>
#include
<sys/socket.h>
#include
<netinet/in.h>
#include
<netdb.h>
#include
<stdio.h>
// printfy
#include <stdlib.h>
// exit()
#include <string.h>
//zawiera definicje memset()

#define SERVER_PORT 4095
#define BUF_SIZE 4096
#define QUEUE_SIZE 10

fatal(
char *x)
{
printf(
"%s", x);
exit(
1);
}

int main(int argc, char **argv)
{
char bufor[BUF_SIZE];
int gniazdo, one = 1, i;
struct hostnet *ServerInfo;
struct sockaddr_in NrIP;

memset(
&NrIP, 0, sizeof(NrIP)); // wypełniam zerami NrIP
NrIP.sin_family = AF_INET; // dziedzina adresów: IPv4
NrIP.sin_addr.s_addr = htonl(INADDR_ANY);
/* może korzystać z każdego numeru IP jaki znajdzie dla danego
komputera. W praktyce oznacza to, że gdy są dwa interfejsy
(np. sieć lokalna z kabelka i wifi(internet) to obsługiwane
będą połączenia od obu tych interfejsów
*/
NrIP.sin_port
= htons(SERVER_PORT); //nr portu

gniazdo
= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
/* SOCK_STREAM - dane przesyłane strumieniowo
IPPRO_TCP - z wykorzystaniem protokolu TCP
*/
if (gniazdo < 0)
fatal(
"Blad utworzenia gniazda\n");

setsockopt(gniazdo, SOL_SOCKET, SO_REUSEADDR, (
char*) &one, sizeof(one));
/*SOL_SOCKET - operacja ma być wykonana na poziomie gniazda
(a nie na przez oprogramowanie IPv4 lub TCP)
SO_REUSEADDR - pozwalamy na wiele równoczesnych połączeń serwera.
Ustawiamy tą wartość (one). Ostatni parametr mówi jak
duża jest zmienna one
*/

//zmienna one nie jest już dalej potrzebna.
one = bind(gniazdo, (struct sockaddr *) &NrIP, sizeof(NrIP));
if (one < 0)
fatal(
"Blad przyporzadkowania adresu IP do gniazda\n");

// maksymalna ilość żądań połączenia
one = listen(gniazdo, QUEUE_SIZE);
if (one < 0)
fatal(
"Error: listen()\n");

//--------------------------------------------------------------
// gniazdo gotowe do pracy
//--------------------------------------------------------------

while (1)
{
one
= accept(gniazdo, 0, 0);
/* argumenty 2 i 3 mogą określać strukturę sockaddr, która
zostałaby wypełniona danymi nt połącznia - niepotrzebne nam to.
*/
if (one < 0)
fatal(
"Error: accept()\n");
read(one, bufor, BUF_SIZE);
// odczytanie nazwy przychodzącego pliku
i = -1;
if (!strcmp(bufor,"LIST")) i = 0;
if (!strcmp(bufor "GET")) i = 1;
if (!strcmp(bufor "CLOSE")) i = 2;

switch (i)
{
case 0:
printf(
"Odebralem LIST\n");
break;
case 1:
printf(
"Odebralem GET\n");
break;
case 2:
printf(
"Odebralem CLOSE\n");
break;
default:
printf(
"Zly format polecenia\n");
break;
};
close(one);
// rozlaczenie
}

}


Jest to szkielet, który jest jeszcze mniej funkcjonalny, niż jego odpowiednik w książce Tanenbauma, ale delikatnie ukształtowany pod kształt tego, co chcę osiągnąć - przynajmniej tak myślę. No i przesadnie wręcz obkomentowany.

EDIT: Wiele więcej problemów niż z samym powyższym kodem, miałem z jego czytelnym zamieszczeniem - dlatego zresztą notka jest tak krótka i skąpa. Posłużyłem się w końcu tym sposobem , ale nie jest do końca skuteczny - między liniami kodu powstały trzyakapitowe przerwy... Wynik wybitnie nie jest zadowalający.

EDIT2: Znalazłem wreszcie świetne narzędzie: www.blogtrog.com. Wada? Nie obsługuje kodu w C/C++... trudno. Grunt, że jest czytelnie i nie trzeba nic ręcznie poprawiać. Victory!

środa, 27 maja 2009

Decyzje

Trzeba je podejmować szybko. Odkładanie momentu podjęcia ostatecznej decyzji, to tylko niepotrzebne zwlekanie w czasie. Tak naprawdę już w pierwszym momencie wiemy, jaki wybór jest bliższy naszemu sercu - chyba, że z góry wiadomo, że stanie się coś, co mocno wpłynie na wybór, tylko nie wiadomo jeszcze jak.

Zwlekanie z decyzją, to tylko podtrzymywanie niepewności. A brak informacji, na których można się oprzeć, to bardzo nieprzyjemna sprawa. Skoro nie ma informacji, tworzy się założenia, a te z kolei łączą się silnie z niedokładnościami. I tak na nietrafionych założeniach tworzy się osądy, a osądy tworzą światopogląd. A ludzie ze skrzywionym światopoglądem podejmują decyzje krzywdzące innych (niezależnie od tego czy podejmą je szybko czy nie ;) ). Powstają nieporozumienia, problemy i takie tam.

Oczywiście nie znaczy to, że decydować się trzeba szybko, zawsze w ułamku sekundy. Czas do namysłu to atut, którym nie można pogardzić. Piętnuję tylko sam akt zwlekania z decyzją. Zastanawiać się dłużej niż dzień to zazwyczaj już strata czasu. Sprawia to tylko, że po podjęciu decyzji częściej i dłużej będziemy rozpamiętywać inne opcje.

Długi czas do namysłu sprawia też iluzję wolności wyboru. Często może się okazać, że zwlekając na ostatnią chwilę, gdy już wreszcie podjęliśmy decyzję, okaże się ona niemożliwa - jest już po prostu za późno.

Podsumowując: najgorsze jest niezdecydowanie.

wtorek, 26 maja 2009

Hello World 2!!

No cóż. Właśnie zostałam współtwórca tego bloga. Zadziwiające uczucie. Jakby zyskać jakąś władzę. No i obrazki. Widzieć swoje zdjęcie w Internecie to tez dziwne uczucie. Zwłaszcza jak pierwszy raz. Ciekawe co tu jeszcze kiedyś będzie :)

poniedziałek, 25 maja 2009

Hello world

Witamy na naszym blogu

Z przerażeniem nieco zakładam tego bloga, szczerze się przyznaję. Mam nadzieję, że nie będzie to kolejne nudne miejsce w sieci, a co konkretnie się tu znajdzie - tego jeszcze nie wiem. Na pewno w najbliższej przyszłości chcę wgrać kilka prostych motywów, na które wpadłem brzdąkając na giatrce, a Tabita odgraża się jakie to zdjęcia tu zamieści... aż się boję!

MarPan