Interfacciarsi con internet

Stato
Discussione chiusa ad ulteriori risposte.

HackLife

Utente Silver
26 Maggio 2008
57
11
0
73
Ciao,
stavo pensando alla realizzazione di un paio dei miei programmi in altri linguaggi, e il problema sta nell'interfacciarsi con internet.
Io pensavo di scriverli in C++, ma ho letto che per questo genere di cose è più consigliabile il Java, che ha già numerose classi nel pacchetto standard progettate proprio per questo genere di cose.
Cosa mi consigliate?

Ciao.
 
Hai letto una qualsiasi guida sui socket prima di fare questa richiesta, compresa la mia?
(Fra parentesi, i socket sono un'astrazione software gestita da tutti i linguaggi e grosso modo alla stessa maniera, la scelta del linguaggio è totalmente indifferente).
 
No, fin'ora avevo utilizzato la urllib di python senza mai pensare ai socket. Se secondo te dovrei me lo appunto come prossima cosa da fare.
 
Io ti consiglio il Perl per i socket :D lo dimostra anche il fatto che il 90% degli exploit che ho visto sono in perl... Sono facilissimi da gestire, pensa che ci riesco anch'io..
 
Se per "interfacciarsi con internet" si intende l'interfaccia con il protocollo HTTP usando i socket, il protocollo è lo stesso in tutti i linguaggi e il meccanismo di funzionamento dei socket anche, quindi non ha senso dire "in questo linguaggio è più semplice".

Home page di Google ottenuta in C:

Codice:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#define	GET		"GET / HTTP/1.1\r\n" \
				"Host: www.google.it\r\n" \
				"Connection: close\r\n\r\n"

#define	HOST		"www.google.it"

void addr_init (struct sockaddr_in *addr, int port, long int ip)  {
	addr->sin_family=AF_INET;
	addr->sin_port = htons((u_short) port);
	addr->sin_addr.s_addr = ip;
}

main (int argc, char **argv)  {
	int sd,i=0;
	char buff;
	char ip[INET6_ADDRSTRLEN];
	struct sockaddr_in server;
	int sock_size=sizeof(server);
	struct hostent *host;

	if (!(host=gethostbyname(HOST)))
		exit(1);

	inet_ntop (host->h_addrtype, host->h_addr, ip, sizeof(ip));
	addr_init (&server,80,inet_addr(ip));

	if ((sd=socket(AF_INET,SOCK_STREAM,0))<0)
		exit(2);

	if (connect(sd, (struct sockaddr*) &server, sock_size)<0)
		exit(3);

	if (send (sd,GET,sizeof(GET),0)<0)
		exit(4);

	while (recv(sd,&buff,1,0)>0)
		printf ("%c", buff);

	close(sd);
	exit(0);
}

in Java:

Codice:
import java.io.*;
import java.net.*;

public class Daytime  {
	public static void main(String args[])  {
		try  {
			InetAddress a = InetAddress.getByName("www.google.it");
			Socket s = new Socket(a,80);
			DataOutputStream out = new DataOutputStream(s.getOutputStream());
			DataInputStream in = new DataInputStream(s.getInputStream());
			String line = null;

			out.writeBytes (
					"GET / HTTP/1.1\r\n" +
					"Host: www.google.it\r\n" +
					"Connection: close\r\n\r\n"
			);

			do  {
				line = in.readLine();
				System.out.println(line);
			} while (line != null);

			s.close();
		}

		catch (Exception e)  {
			e.printStackTrace();
		}
	}
}
 
Mi dicono che il perl è simile al python quindi darò sicuramente un'occhiata... prima mi vado a leggere la guida ai socket di black però 8D
Comunque @BlackLight: Guardando i tuoi esempi mi sento sconcertanto. Quello che avrei fatto fino ad ora, in Python, sarebbe una cosa del tipo:
Codice:
import urllib

page = urllib.urlopen('http://www.google.com')
page.read()
Ora, mi viene da pensare che c'è qualcosa che non ho capito. Perché usare i socket dovrebbe essere utile se è così più 'costoso' in termini di stesura del codice? Devo leggere subito qualche guida perché sono disorientato.

Edit: Ho provato a leggere la tua guida Black, ma la trovo un po' diffcile. Avrei bisogno di un'infarinatura sul funzionamento stesso di un socket, qualcuno conosce qualche link che faccia al caso mio?
 
HackiLife, urllib e' una libreria che semplifica l'interfacciamento HTTP, per questo e' piu' facile, se tu avessi voluto usare i socket in python avresti dovuto scrivere diverse righe in piu'.

Probabilmente anche per C/C++ ci sono librerie prettamente orientate al protocollo HTTP.

I socket servono perche' il mondo non funziona solo con HTTP, come non funziona solo col protocollo TCP.

Edit: vedi qui.
 
Ovviamente.

Source di urllib: http://infernet.pastebin.com/f44542dd7

Le librerie servono a questo ;)
 
meh. ha detto:
Probabilmente anche per C/C++ ci sono librerie prettamente orientate al protocollo HTTP.

cURL

Lo stesso codice visto prima con le cURL in C è qualcosa del genere:

Codice:
#include <stdio.h>
#include <curl/curl.h>

int main()  {
	CURL *curl;
	CURLcode res;

	curl_global_init(CURL_GLOBAL_ALL);

	if (!(curl=curl_easy_init()))
		return 1;

	curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.it");
	res = curl_easy_perform(curl);

	printf ("%s\n", res);
	curl_easy_cleanup(curl);
	return 0;
}

Questo lato client. Ovviamente lato server, per lo sviluppo di CGI, ci sono anche tante altre librerie, fra cui la mia CGIC.
Ma personalmente preferisco usare i socket nudi e crudi che tante librerie dipendenti dal linguaggio, dall'OS, dalle implementazioni ecc.
Anche perché faccio prima a ricordare come va strutturata una richiesta HTTP e poi strutturarla in qualsiasi linguaggio usando i socket che imparare se il curl_global_init() va messo prima o dopo il curl_easy_init() e tutti i vari nomi dei metodi, che dipendono dal linguaggio in cui si sviluppa, dalla libreria che si usa e dalla versione della libreria che si usa.

@HackLife: Si, robe come cURL (in C o PHP o quel che vuoi), LWP in Perl o urllib in Python non sono altro che codice precotto per l'interfacciamento con il protocollo HTTP che a basso livello non fa altro che usare i socket. Ma come dicevo io preferisco imparare una sola cosa (com'è fatto il protocollo HTTP, e ovviamente come funziona un socket) che imparare le API per l'uso della libreria X versione Y nel linguaggio Z, o perdere tempo sulla documentazione o gli esempi per vedere come funziona.
 
ciao ragazzi, ho lo stesso tipo di problema, avrei bisogno di sapere se delphi 6 ha da qualche parte una libreria dedicata a internet... grazie
 
letca ha detto:
ciao ragazzi, ho lo stesso tipo di problema, avrei bisogno di sapere se delphi 6 ha da qualche parte una libreria dedicata a internet... grazie

http://www.google.com/search?q=delphi6+http+library

e cmq i socket, se hai letto, ci sono in praticamente tutti i linguaggi
 
Stato
Discussione chiusa ad ulteriori risposte.