View Full Version : [C++] Internet
Karlosoft
07-12-2007, 14:26
Conosciete un modo per interfacciarmi ad internet con il C++???
spiegati meglio, vorresti sapere quali sarebbero le librerie utili?
Karlosoft
07-12-2007, 14:30
Devo sapere quali librerie, e possibilmente sapere dove trovarne una documentazione, usare per connettermi ad un server e ricevere una risposta, inviarvi dati.
devi usare i socket; si tratta di un'interfaccia di programmazione che esiste quasi identica sia su Windows che su molti derivati di Unix, tra cui ovviamente Linux.
su Windows oltre all'interfaccia originale dei socket esistono anche delle funzioni aggiuntive, ed il tutto prende il nome di Windows Sockets 2 (2 perché prima c'era la versione 1 che faceva più schifo).
qua c'è tutto: http://msdn2.microsoft.com/en-us/library/ms740673.aspx
in sostanza un socket è una capability (quindi un file descriptor su Unix e un HANDLE su Windows) che, per così dire, mappa le sue operazioni di I/O su una connessione di rete, connessione che può essere ad esempio una connessione TCP/IP su una determinata porta.
Karlosoft
07-12-2007, 15:20
Funziona anche su DevC++?
variabilepippo
07-12-2007, 15:55
usare per connettermi ad un server e ricevere una risposta
A quale tipo di server vuoi connetterti? HTTP? FTP? SMTP/POP3? Altro?
Sistema operativo? Compilatore?
Se non hai bisogno di altro, puoi guardare questa libreria: http://curl.haxx.se/libcurl/
Karlosoft
07-12-2007, 20:38
Os WIndows (ma se possibile esportabili anche se linux altrimenti è uguale), compilatore minGW, installato su ide Dev-C++. La possibilità di usare connessioni di vari tipi è alettante.
Os WIndows (ma se possibile esportabili anche se linux altrimenti è uguale), compilatore minGW, installato su ide Dev-C++. per programmare codice sorgente C/C++ che usi i sockets e che sia compilabile sia su Windows che su Linux serve qualche piccola accortezza ed inevitabilmente qualche #ifdef. la differenza più evidente tra la programmazione dei socket tra Windows e Linux è l'inizializzazione: su Windows devi inizializzare la libreria Winsock chiamando la funzione WSAStartup (e finalizzare con WSACleanup), mentre su Linux non è necessario. altra differenza sostanziale è il tipo dei file descriptors: i sockets su Linux sono dei semplici int, mentre su Windows il tipo si chiama SOCKET (è sufficiente che su Linux aggiungi un #define SOCKET int). per il resto dovrebbe essere tutto uguale, tranne ovviamente il fatto che devi evitare di utilizzare funzioni specifiche di Winsock.
La possibilità di usare connessioni di vari tipi è alettante. ergo credo proprio che i socket facciano al caso tuo. quando si dice che un socket può essere utilizzato per stabilire una connessione si parla molto in astratto: anche se l'uso più comune è tramite TCP/IP, un socket può essere utilizzato potenzialmente una connessione di qualunque tipo (anche tra processi diversi sulla stessa macchina, e non parlo necessariamente di loopback di TCP/IP). determinate funzioni infatti permettono di scegliere il protocollo sia di livello transport che di livello network, è quindi possibile inviare dati sia via TCP che via UDP, e sia via IPv4 che IPv6.
non so di preciso come funzioni su Linux, ma su Windows è addirittura possibile implementare nuovi protocolli.
Karlosoft
08-12-2007, 13:00
Mi rimane un piccolo dubbio. Cosa devo fare, scaricarle??? E in caso contrario c'è un dll o una cartella con gli header da includere??
la DLL che ti interfaccia coi Windows Sockets 2 si chiama ws2_32.dll ed è già fornita con qualsiasi installazione di Windows (si trova in system32).
ora vai nella cartella di installazione del MinGW, sottocartella lib: troverai un file libws2_32.a da passare in input al linker affinché esso generi un eseguibile che usi ws2_32.dll. non è necessario che specifichi manualmente la libws2_32, dovrebbe essere tra quelle specificate automaticamente (che includono tutte quelle necessarie a linkarti alle API Win32).
se vai invece nella sottocartella include della cartella di installazione del MinGW troverai l'header winsock2.h che devi includere per programmare coi sockets.
la DLL che ti interfaccia coi Windows Sockets 2 si chiama ws2_32.dll ed è già fornita con qualsiasi installazione di Windows (si trova in system32).
ora vai nella cartella di installazione del MinGW, sottocartella lib: troverai un file libws2_32.a da passare in input al linker affinché esso generi un eseguibile che usi ws2_32.dll. non è necessario che specifichi manualmente la libws2_32, dovrebbe essere tra quelle specificate automaticamente (che includono tutte quelle necessarie a linkarti alle API Win32).
se vai invece nella sottocartella include della cartella di installazione del MinGW troverai l'header winsock2.h che devi includere per programmare coi sockets. te la faccio breve: includi winsock2.h e comincia a programmare :D
Karlosoft
08-12-2007, 14:00
Grazie, ora ci sono!!! Si è come avevi dettu tu, libws2_32.a non c'è bisogno di includerlo.
A questo punto per iniziare a programmare devo trovare una guida. Conoscete qualche titolo? 71104 mi ha segnalato le referenze su MSDN, ma le referenze non spiagano come fare purtroppo...
Provando ad eseguire un pezzo di codice ho visto che non funziona... L'ho preso dalle referenze microsoft, ma non va. (in realtà era un pezzo di codice, mancava la definizione di main e degli include)
#include <cstdlib>
#include <iostream>
#include <winsock2.h>
using namespace std;
int main(int argc, char *argv[])
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 1;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return 1;
}
return 0;
}
perché non va, scusa? che problemi ti da? tieni presente che quello è un programma che non fa nulla, o meglio, non fa altro che inizializzare la libreria (WSAStartup) e poi la richiude subito (WSACleanup).
Karlosoft
08-12-2007, 14:44
Ritiro tutto ho sistemato il problema!
Karlosoft
08-12-2007, 18:27
Una piccola cosa che non ho capito, per mandare dati e riceverli devo usare recv e send o cos'altro? In caso siano questi due, ci sono due parametri
#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "27015"
Cosa rappresentano i due define? In particolare, nel secondo, deve essere sostituito con 8080???
si, per mandare e ricevere dati via socket TCP/IP si usano generalmente send e recv. i due define non riguardano l'interfaccia dei socket, devi averli trovati in qualche esempio; uno sembra essere la dimensione di un buffer di invio o di ricezione, l'altro è chiaramente un numero di porta.
Karlosoft
09-12-2007, 14:45
Ok. Mi sono accorto di una cosa. Se provo a collegarmi al mio indirizzo su altervista, mi richiama l'indirizzo ip di altervista. COme è possibile??? COme faccio ad interfacciarmi con il mio soto?
Ok. Mi sono accorto di una cosa. Se provo a collegarmi al mio indirizzo su altervista, mi richiama l'indirizzo ip di altervista. COme è possibile??? COme faccio ad interfacciarmi con il mio soto? non è che ogni sito che esiste su internet stia sulla sua propria macchina eh... connettiti al server di Altervista e fai la richiesta HTTP per il tuo sito (non ricordo la sintassi esatta, comunque è una richiesta GET).
Karlosoft
10-12-2007, 12:28
Quindi devo scrivere una roba del tipo
GET /index.php HTTP/1.1
Host: karlosoft.altervista.org
E settare come indirizzo ip quello di altervista???
Karlosoft
30-12-2007, 14:29
COme facio a fare in modo che ad esempio il mio server o il mio client non si blocchino dorante l'esecuzione della richiesta?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.