PDA

Visualizza la versione completa : [C] socket per newbie


billiejoex
23-06-2005, 23:24
Ciao a tutti.
Ho una scarsa infarinatura della sintassi di base del C su ambienti win32 e vorrei azzardare ad addentrarmi nello studio dei socket per iniziare a creare qualche semplice applicativo che giri su TCP/IP. Alcune domande:

1) anzitutto mi servirebbe un punto di riferimento su cui studiare. Una guida a prova di imbecille in cui venga spiegato anche il piu piccolo particolare e non venga dato per scontato nulla. Avete qualcosa in particolare da consigliarmi?

2) Sono un utilizzatore di sistemi sia Windows che GNU/Linux.
Iniziando a studiare questo tipo di argomentazione mi conviene buttarmi sulle socket dei sistemi unix o le winsock dei sistemi Windows?
Ho come l'impressione che le prime siano più facili da gestire ma la diffusione delle piattaforme Microsoft giocherebe sicuramente a mio favore per quanto riguarda la reperibilità di materiale online quali thread, sources, how tos e documentazione varia.

2bis) le differenze tra socket e winsocket sono sostanziali? Ipotizzando che mi addentri nello studio delle prime avrei difficoltà a passare successivamente allo studio delle seconde? Inoltre, la differenza di architettura dei due sistemi influisce sulla programmazione C in modo significativo?

3) Quanto è importante il livello di conoscenza del C? E' fondamentale avere un infarinatura più che buona per azzardare ad addentrarsi nella programmazione in socket?
Personalmente non mi reputo neanche sufficiente.
Ho letto una manciata di guide e posso dire di conoscere a livello molto "amatoriale" la sintassi e i concetti fondamentali quali variabili, strutture, array, puntatory ecc... ma le lacune riguardo il linguaggio sono quanto mai evidenti.


Mi scuso per la quantità di domande da neofita ma la voglia di mettersi a creare applicativi di rete è davvero forte.


Ringrazio anticipatamente chiunque abbia gia intrapreso il percorso che mi accingo ad iniziare e abbia il buon cuore di consigliarmi.


Saluti.

maiosyet_2
24-06-2005, 02:21
Originariamente inviato da billiejoex

1) anzitutto mi servirebbe un punto di riferimento su cui studiare. Una guida a prova di imbecille in cui venga spiegato anche il piu piccolo particolare e non venga dato per scontato nulla. Avete qualcosa in particolare da consigliarmi?

Di completo completo non ho mai trovato nulla neppure io, ma questo è un buon punto di inizio:
http://www.ecst.csuchico.edu/~beej/guide/net/html/



la diffusione delle piattaforme Microsoft giocherebe sicuramente a mio favore per quanto riguarda la reperibilità di materiale online quali thread, sources, how tos e documentazione varia.

Hahahahah ti sbagli di grosso :D
Le winsock ti fregano... tanto per cominciare il mondo gira su Unix e non certo su Windows; inoltre se conosci le socket Unix (che poi sono quelle standard :fagiano: ) il passo alle libcap è breve, e con quelle fai cose carine sul serio :)
Sulle winsock troveresti qualche tutorial o poco più, ma il codice in rete sulle winsock... :incupito:




3) Quanto è importante il livello di conoscenza del C?

Non indispensabili per seguire la guida, ma appena ti leggi qualche sorcio rischi di non capir nulla :fagiano:
Almeno in teoria devi sapere la sintassi

Un ultimo appunto: per applicazioni di rete ad alto livello (che usino protocolli classici) usare il C è uno sbatti inutile: con Perl e Python faresti molto prima... punta sul C se vuoi fare networking a basso livello. Molto basso :D

billiejoex
24-06-2005, 13:18
Perl e Python?
Uhm... non li ho visti manco in fotografia ma a naso non mi spirano granchè.
Cmq appena vedo i sorgenti riportati nella guida che mi hai consigliato, relativa ai socket, mi viene da piangere.
Ma tu ci capisci? :D

maiosyet_2
24-06-2005, 14:33
Originariamente inviato da billiejoex
Perl e Python?
Uhm... non li ho visti manco in fotografia ma a naso non mi spirano granchè.

Perl e Python sono due linguaggi di scripting di alto livello, di conseguenza ti semplificano un certo tipo di lavoro e te ne rendono impossibile un altro.
Con Perl e Python puoi gestire le socket piuttosto bene e più facilmente, ma 1) c'è molta meno documentazione in giro 2) sono sempre linguaggi di alto livello, quindi con Python non ti puoi mettere a smanettare sugli header di un icmp :D



Cmq appena vedo i sorgenti riportati nella guida che mi hai consigliato, relativa ai socket, mi viene da piangere.
Ma tu ci capisci? :D

Quei sorgenti sono semplici :stordita:
Ad ogni modo il metodo migliore è leggersi un po' di man Linux quando non capisci e provare a scrivere qualcosa tu, magari partendo da sorci altrui. In rete ne trovi parecchi.
Installati le libcap e stampati il man. visto che pure qui di documentazione ce n'e' poca.

pprllo
24-06-2005, 16:44
Interessa anche a me l'argomento. Però siccome sono inchiodato su piattaforma Windows ( :dhò: ), cosa mi consigli ?

Habanero
25-06-2005, 02:23
Le socket (o i socket come dice qualcuno) nascono su BSD e poi sono state trapiantate su tutte le versioni Unix, quindi (nel senso di poi... :D ) su Linux.
Conoscere le basi del funzionamento delle BSD socket sicuramente aiuta anche nell'uso di Winsock. Ci sono alcune differenze ma per le prime sperimentazioni le differenze non sono abissali e comunque i concetti base sono quelli. Esempio che risalta subito su win è l'uso iniziale di WSAStartup e finale di WSACleanup che su *nix non esistono assolutamente... ma questo non è un problema, basta saperlo.

Altra differenza è che su *nix c'è omogeneità tra i socket e i file descriptor. Su windows no! questo ha delle importanti implicazioni nell'uso della redirezione. Ma questo fa già parte di un argomanto più "avanzato" e non ti sto ad annoiare.

Ti dico per esperienza che a livello base (e qui parlo di inviare e ricevere semplici messaggi come può essere una interrogazione client-server) non ci sono sostanziali differenze.


Per quanto concerne la conoscenza del C, mi associa alle considerazioni di maiosyet_2. Esistono delle strutture dati abbastanza complicate nell'ambito delle socket per uno che non ha dimestichezza col linguaggio. Mi riferisco in particolare a sockaddr /sockaddr_in e hostent usate nell'inizializzazione degli endpoint (ip/porta etc) e nella risoluzione dei nomi. Queste contengono strutture nidificate e accedervi a volte è un problema anche per chi conosce il C ma non ha freschi concetti quali puntatori e roba simile.

Tu puoi benissimo impararti le linee di codice a memoria o fare copia/incolla e modificare quello che ti serve ma se ci devi mettere del tuo per creare una cosa un po' "diversa" rischi di non riuscirci se non hai capito bene i concetti. Per cominiciare comunque puoi fare copia/incolla... :D

Documentazione: mi associo nuovamente a maiosyet_2. Roba su BSD socket ne trovi ovunque. Cercando bene la trovi comunque anche per Win. I link sotto possono esserti utili (non sono tutti allo stesso livello come argomenti affrontati:


http://burks.bton.ac.uk/burks/pcinfo/progdocs/wsocktut/winsock.htm
http://tangentsoft.net/wskfaq/

Riferimenti all'interfaccia:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/windows_sockets_start_page_2.asp
http://www.jimprice.com/winsock/winsock2api-withtoc.PDF
ftp://ftp.microsoft.com/bussys/winsock/winsock2/WSAPI22.DOC

Fox82
25-06-2005, 09:28
Per programmare su piattaforma Linux dai un'occhiata qui:

http://gapil.firenze.linux.it/

:ciauz:

cikko
25-06-2005, 13:20
Per i socket in Windows dare un'occhiata anche a questi link:
http://www.sockets.com
http://www.ukhp.info/winsock
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/winsock_functions.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/wsastartup_2.asp
http://www.hal-pc.org/~johnnie2/winsock.html
http://www.nexit.no/wsock.html
http://www.sockaddr.com
http://telemat.die.unifi.it/book/1997/winsock_prg/wsk_doc1.html

Saluti

billiejoex
28-06-2005, 00:03
Beh... grazie di cuore a tutti. Inizio a spulciare i links segnalati. In casi di progressi vi farò sapere.

:)

Loading