/* Gniazdka, najprostszy przyklad ... ---------------------------------- */ #include "unix.h" #define PORT 7000 void ObsSygnalu(int p) { printf("pojawil sie sygnal SIGPIPE !!! (pid==%i)\n",getpid()); } char *AdresCyfrowyKropkowy(char *name); main() { signal(SIGPIPE,ObsSygnalu); // na wszelki wypadek ... int pid,status,i,j; pid=fork(); if(pid==0) // pp: tutaj bedzie serwer ... { printf("serwer: pid==%i\n",getpid()); int sock=socket (AF_INET,SOCK_STREAM,0); struct sockaddr_in adres; memset(&adres,0,sizeof(adres)); adres.sin_family=AF_INET; //adres.sin_addr.s_addr=inet_addr(AdresCyfrowyKropkowy("venus")); //adres.sin_addr.s_addr=INADDR_ANY; adres.sin_addr.s_addr=inet_addr(AdresCyfrowyKropkowy("localhost")); adres.sin_port=htons(PORT); i=bind(sock,(struct sockaddr *)&adres,sizeof(adres)); printf("serwer: bind()=%i\n",i); listen(sock,5); // czekamy na dokladnie 2 klientow ! // int licznik; for(licznik=1;licznik<=2;licznik++) { printf("serwer: czekam na klienta nr %i\n",licznik); int nowy_sock=accept(sock,NULL,NULL); printf("serwer: accept()=%i\n",nowy_sock); printf("serwer: poczatek obslugi klienta nr %i\n",licznik); char buf[100]; i=read(nowy_sock,buf,99); buf[i]=0; printf("serwer: read()=%i buf=%s\n",i,buf); j=write(nowy_sock,buf,i); printf("serwer: write()=%i\n",j); // jak widac serwer dziala jak 'echo' // odsyla to co przyszlo ! close(nowy_sock); } close(sock); exit(0); } else // pm: tutaj bedzie klient ... { printf("klient: pid==%i\n",getpid()); extern void klient(char *); sleep(1); printf("klient: pierwsze polaczenie ...\n"); klient("1234567890"); sleep(1); printf("klient: drugie polaczenie ...\n"); klient("QWERTYUIOP"); i=wait(&status); printf("klient: wait()=%i %04X\n",i,status); } } void klient(char *c) { int i,j; int sock=socket (AF_INET,SOCK_STREAM,0); struct sockaddr_in adres; memset(&adres,0,sizeof(adres)); adres.sin_family=AF_INET; //adres.sin_addr.s_addr=inet_addr(AdresCyfrowyKropkowy("venus")); //adres.sin_addr.s_addr=inet_addr("1.2.3.4"); //adres.sin_addr.s_addr=INADDR_ANY; adres.sin_addr.s_addr=inet_addr(AdresCyfrowyKropkowy("localhost")); adres.sin_port=htons(PORT); i=connect(sock,(struct sockaddr *)&adres,sizeof(adres)); printf("klient: connect()=%i\n",i); i=write(sock,c,strlen(c)); printf("klient: write()=%i\n",i); char buf[100]; i=read(sock,buf,99); buf[i]=0; printf("klient: read()=%i buf=%s\n",i,buf); close(sock); } typedef struct in_addr in_addr_mh; // naprawde trzeba to tak robic??? char *AdresCyfrowyKropkowy(char *name) { struct hostent *hostp; if ((hostp=(struct hostent *)gethostbyname(name))!=NULL) { return inet_ntoa(*(in_addr_mh*)*hostp->h_addr_list); // jak dlugo ten wynik istnieje ?????? } }