Dovrei programmare usando i socket sotto Unix e volevo sapere se c'è qualche guida.
E poi devo usare qualche libreria speciale????
Dovrei programmare usando i socket sotto Unix e volevo sapere se c'è qualche guida.
E poi devo usare qualche libreria speciale????
P.
Se funziasse anche sotto winzozz o linux sarebbe perfetto!!![]()
![]()
![]()
P.
qualcosa sul file sys/socket.h .....![]()
![]()
:quipy:
![]()
P.
library "speciale" ?!?!?!?!?!?!?!?!
non è mica winsock2 !
è tutto già a disposizione nel kernel, usa il comando man:
> man socket
> man gethostbyname
se usi il kde, digita l'url man:/ nella location bar.
comunque:
naturalmente non è testato...codice:#include <netdb.h> #include <sys/types.h> #include <sys/socket.h> ... // cerca l'host struct in_addr host; struct hostent* ip = gethostbyname("www.html.it"); host.s_addr=*(int*)(ip->h_addr); // crea il socket int sock = socket(AF_INET,SOCK_STREAM,0); // lo connette all'host struct sockaddr_in sai; sai.sin_family=PF_INET; sai.sin_port=htons(((short)80)); memcpy(&sai.sin_addr,host,sizeof(*host)); connect(sock,(struct sockaddr*)&sai,sizeof(sai)); // il gioco è fatto: FILE* fp = fdopen(sock, "rw"); // manda un comando HTTP fprintf(fp, "HEAD / HTTP/1.1\r\n\r\n"); // legge la risposta char buf[255]; do { fgets(buf, 255, fp); printf("%s", buf); } while(buf[0] != '\r'); // chiude fclose(fp);
ciao
-> Stevens, "Unix Network Programming"
occhio se devi scrivere codice funzionante anche in windows, una socket in windows non e' un descrittore di file.
Ciao
comunque se usi direttamente i winsock (NON la classe wrapper MFC CSocket) l'interfaccia di basso livello è più o meno uguale.
l'interfaccia CSocket è un insulsa: funziona tutta a messaggi e se sei bloccato ad esempio in lettura non puoi terminare il CWinThread che detiene il message loop.
Naturalmente c'è la CancelBlockingCall ma se la usi devi stare molto più attento ai deadlock tra thread e ai memory leaks; e per evitare memory leaks in chiusura di un thread devi fare un join sul thread... un casino.
Ciao,
Per la portabilita' tra windows e unix credo che basti avere l'avvertenza di usare solo send e recv per invio e ricezione, anche se sono scomodissimi, considerare le differenze tra fcntl o ioctl e la controparte windows ioctlsocket, usare delle define per close / closesocket, delle define per evitare di confondere il tipo SOCKET di windows con il tipo file descriptor (int) di Unix, definire INVALID_SOCKET -1 in Unix, uno wrapper per errno / GetLastError(). Per le socket non bloccanti usare delle select (vedi man) con dei timeout.
Quanto ho detto e' da dimostrare, ma sembra funzionare, comunque.