Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    9

    [C] connessione ad URL con parametri GET

    Ciao, ho bisogno del vostro aiuto, mi sono imbattuto nella programmazione dei socket in C in ambiente windows7. Devo collegarmi tramite codice ad un url comprensiva di parametro GET (es. http://127.0.0.1/memGetParams.php?m=ciao). Dopo tante ricerche ho scelto come IDE eclipse per C insieme a mingw. Il test con HelloWord è ok quindi credo di aver configurato tutto bene, ma quando cerco di far girare esempi con i socket, sorgono problemi. Ho prelevato esempi da http://unsecure.altervista.org/socket/socket.htm. Ho provato l'esempio server.c e il risultato della console è:
    codice:
    gcc -O0 -g3 -Wall -c -fmessage-length=0 -o server.o ..\server.c
    gcc -o server.exe server.o
    server.o: In function `main':
    D:\workspacesC\server\Debug/../server.c:22: undefined reference to `WSAStartup@8'
    D:\workspacesC\server\Debug/../server.c:29: undefined reference to `socket@12'
    D:\workspacesC\server\Debug/../server.c:31: undefined reference to `htons@4'
    D:\workspacesC\server\Debug/../server.c:33: undefined reference to `bind@12'
    D:\workspacesC\server\Debug/../server.c:34: undefined reference to `listen@8'
    D:\workspacesC\server\Debug/../server.c:36: undefined reference to `accept@12'
    D:\workspacesC\server\Debug/../server.c:38: undefined reference to `send@16'
    D:\workspacesC\server\Debug/../server.c:39: undefined reference to `closesocket@4'
    D:\workspacesC\server\Debug/../server.c:40: undefined reference to `closesocket@4'
    D:\workspacesC\server\Debug/../server.c:41: undefined reference to `WSACleanup@0'
    collect2: ld returned 1 exit status
    Build error occurred, build is stopped
    Potete spiegarmi il significato? Con una ricerca mi sembra di aver capito che dipende dalle librerie di win ....??

    Per quanto riguarda il mio programmino avevo scritto:
    codice:
    void main(int argc, char *argv[]){
    	int sock;
    	struct sockaddr_in sAddr;
    	unsigned short sPort = 80;
    	char *sIP = "127.0.0.1"; //qui posso inserire l'url con i param???
    	WSADATA wsaData;
    
    	if(WSAStartup(MAKEWORD(2,0), &wsaData) !=  0)
    	{
    		fprintf(stderr, "wsa start error");
    		exit(1);
    	}
    
    	if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
    		DieWithError("socket failed");
    		}
    
    	memset(&sAddr, 0, sizeof(sAddr));
    	sAddr.sin_family = AF_INET;
    	sAddr.sin_addr.s_addr = inet_addr(sIP); 
    	sAddr.sin_port = htons(sPort);
    
    	if (connect(sock, (struct sockaddr *)&sAddr, sizeof(sAddr)) < 0){
    		DieWithError("connect failed");
    	}
    
    	closesocket(sock);
    	WSACleanup();
    	exit(0);
    }
    e l'errore è:

    codice:
    **** Internal Builder is used for build               ****
    gcc -o testSocket2.exe client.o
    client.o: In function `main':
    D:\workspacesC\testSocket2\Debug/../client.c:24: undefined reference to `WSAStartup@8'
    D:\workspacesC\testSocket2\Debug/../client.c:30: undefined reference to `socket@12'
    D:\workspacesC\testSocket2\Debug/../client.c:41: undefined reference to `htons@4'
    D:\workspacesC\testSocket2\Debug/../client.c:43: undefined reference to `connect@12'
    D:\workspacesC\testSocket2\Debug/../client.c:47: undefined reference to `closesocket@4'
    D:\workspacesC\testSocket2\Debug/../client.c:48: undefined reference to `WSACleanup@0'
    collect2: ld returned 1 exit status
    Build error occurred, build is stopped
    Potete darmi una mano?? consigli, spiegazioni, anche codice.
    Se avete bisogno di chiarimenti scrivete, non so se non ho scritto qualcos'altro di importante, adesso non mi viene in mente.

    Vi ringrazio in anticipo.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Beh, Eclipse e mingw con Windows, a mio parere, non sono una grande scelta.

    Vuoi utilizzare Windows? Allora la migliore soluzione sarebbe VC++ EE ... ma è una mia opinione.

    Per il resto, il problema è che il linker non sa quale sia la libreria per i socket. Puoi provare aggiungendo

    -lws2_32

    al comando gcc
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    9
    Grazie per il consiglio, mi fido, è la prima volta che uso un ide di questo livello per c.
    Ma quale è la differenza tra Visual C# 2010 Express e Visual C++ 2010 Express, quale devo scaricare?
    dopo averlo installato provo gli esempi e il mio codice, per vedere se va tutto bene.
    Ma bisogna fare qualche configurazione per VC..?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    C# e C++ sono linguaggi diversi. Tu devi usare il C++.

    Il C# si basa sul Framework .Net, il secondo non necessariamente (ovviamente, per tutte le differenze ti consiglio di fare delle ricerche dato che non si possono elencare in una risposta di un forum).

    Di quale "configurazione" parli?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    9
    Ho parlato di configurazione, perchè per eclipse molte guide dicevano di installare altri componenti. cmq adesso installo vc++, e ti faccio sapere. grazie per le info.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    No ... installa Visual C++ e basta.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    9
    Ho installato vc++, creato il progetto vuoto, copiato il codice di esempio (server.c del sito che ho segnalato). A questo punto se scelgo "Compila" sul file c la compilazione va a buon fine, quando cerco di eseguirlo (F5) dice di compilare il progetto e da errore:
    codice:
    ------ Inizio compilazione: Progetto: testServer, Configurazione: Debug Win32 ------
    server.obj : error LNK2019: riferimento al simbolo esterno _WSACleanup@0 non risolto nella funzione _main
    server.obj : error LNK2019: riferimento al simbolo esterno _closesocket@4 non risolto nella funzione _main
    server.obj : error LNK2019: riferimento al simbolo esterno _send@16 non risolto nella funzione _main
    server.obj : error LNK2019: riferimento al simbolo esterno _accept@12 non risolto nella funzione _main
    server.obj : error LNK2019: riferimento al simbolo esterno _listen@8 non risolto nella funzione _main
    server.obj : error LNK2019: riferimento al simbolo esterno _bind@12 non risolto nella funzione _main
    server.obj : error LNK2019: riferimento al simbolo esterno _htons@4 non risolto nella funzione _main
    server.obj : error LNK2019: riferimento al simbolo esterno _socket@12 non risolto nella funzione _main
    server.obj : error LNK2019: riferimento al simbolo esterno _WSAStartup@8 non risolto nella funzione _main
    D:\projectVisualC++\testServer\Debug\testServer.exe : fatal error LNK1120: 9 esterni non risolti
    ========== Compilazione: 0 completate, 1 non riuscite, 0 aggiornate, 0 ignorate ==========
    Mi sembra di capire che è lo stesso di eclipse. Devo aggiungere l'opzione "-lws2_32" in vc++? se si, dove?
    Non so come risolvere, eppure non dovrebbe essere così complicato....

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Semplicemente, all'inizio del codice sorgente inserisci la linea

    #pragma comment (lib, "Ws2_32.lib")
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    9
    Adesso sembra funzionare
    Ho preso spunto da codice in rete e l'ho modificato un po.
    Vi posto il codice:
    codice:
    /*
    ** httpGET.cpp -- a stream socket HTTP client demo
    */
    
    /*Uncomment for your system*/
    /*#define LINUX 1*/
    #define WINDOWS 1
    
    #pragma comment (lib, "Ws2_32.lib")
    
    #ifdef LINUX
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
    #include <netdb.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #endif
    #ifdef WINDOWS
    #include <winsock.h>
    #include <stdio.h>
    #endif
    
    #define PORT 80 // the port client will be connecting to
    
    #define MAXDATASIZE 1024 // max number of bytes we can get at once
    #define HTTP_GET "GET %s HTTP/1.1\nHost: %s\n\n"
    
    void DieWithError(char *errorMessage)
    {
    	printf("%s\n",errorMessage);
    	exit(1);
    }
    
    int main(int argc, char *argv[])
    {
    #ifdef WINDOWS
        WSADATA wsaData;
    #endif
        int sockfd, numbytes, length;
        char buf[MAXDATASIZE];
        char request[250];
        char *response = "";
        struct hostent *he;
        struct sockaddr_in their_addr; // connector's address information
    
    	char *url = "localhost";
    	char *params = "/memGetParams/memGetParams.php?p=pippo&m=ciao";
    
    #ifdef WINDOWS
        if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
    		DieWithError("WSAStartup failed.\n");
        }
    #endif
    
        if ((he=gethostbyname(url)) == NULL) {  // get the host info
    		DieWithError("gethostbyname");
        }
    
        if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
    		DieWithError("socket");
        }
    
        their_addr.sin_family = AF_INET;    // host byte order
        their_addr.sin_port = htons(PORT);  // short, network byte order
        their_addr.sin_addr = *((struct in_addr *)he->h_addr);
        memset(their_addr.sin_zero, '\0', sizeof their_addr.sin_zero);
    
        if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof their_addr) == -1) {
            DieWithError("connect");
        }
    
       sprintf(request, HTTP_GET, params, url);
    
       if ((numbytes=send(sockfd, request, strlen(request), 0)) == -1) {
           DieWithError("send"); 
        }
     
        if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
            DieWithError("recv");
        }
    
        buf[numbytes] = '\0';
    
        sscanf(buf, "Content-Length: %d", &length);
    
        response = (char*)malloc(sizeof(char)*length);
    
        for(; numbytes < length; numbytes += recv(sockfd, buf, MAXDATASIZE-1, 0)){
           strcat(response, buf);
           buf[numbytes] = '\0';
        }
    
        printf("%s\n",response);
    
        free(response);
    
    #ifdef LINUX
        close(sockfd);
    #else
        WSACleanup();
    #endif
    
    	return 0;
    }
    Il codice compila e si esegue, ma l'output di debug di vc++ mi da:

    codice:
    'httpGET.exe': caricato 'D:\projectVisualC++\httpGET\Debug\httpGET.exe', Simboli caricati.
    'httpGET.exe': caricato 'C:\Windows\System32\ntdll.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\kernel32.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\KernelBase.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\ws2_32.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\msvcrt.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\rpcrt4.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\nsi.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\msvcr100d.dll', Simboli caricati.
    'httpGET.exe': caricato 'C:\Windows\System32\nlaapi.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\NapiNSP.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\sechost.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\pnrpnsp.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\mswsock.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\user32.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\gdi32.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\lpk.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\usp10.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\imm32.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\msctf.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Program Files\Windows Searchqu Toolbar\Datamngr\datamngr.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\wtsapi32.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\advapi32.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\dbghelp.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': scaricato 'C:\Program Files\Windows Searchqu Toolbar\Datamngr\datamngr.dll'
    'httpGET.exe': scaricato 'C:\Windows\System32\dbghelp.dll'
    'httpGET.exe': scaricato 'C:\Windows\System32\advapi32.dll'
    'httpGET.exe': scaricato 'C:\Windows\System32\wtsapi32.dll'
    'httpGET.exe': caricato 'C:\Program Files\Windows Searchqu Toolbar\Datamngr\IEBHO.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\dbghelp.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': scaricato 'C:\Program Files\Windows Searchqu Toolbar\Datamngr\IEBHO.dll'
    'httpGET.exe': scaricato 'C:\Windows\System32\dbghelp.dll'
    'httpGET.exe': caricato 'C:\Windows\System32\dnsapi.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\winrnr.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Program Files\Bonjour\mdnsNSP.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\IPHLPAPI.DLL', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\winnsi.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\FWPUCLNT.DLL', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\rasadhlp.dll', Impossibile trovare o aprire il file PDB
    'httpGET.exe': caricato 'C:\Windows\System32\WSHTCPIP.DLL', Impossibile trovare o aprire il file PDB
    'httpGET.exe': scaricato 'C:\Windows\System32\WSHTCPIP.DLL'
    'httpGET.exe': scaricato 'C:\Windows\System32\nlaapi.dll'
    'httpGET.exe': scaricato 'C:\Windows\System32\NapiNSP.dll'
    'httpGET.exe': scaricato 'C:\Windows\System32\pnrpnsp.dll'
    'httpGET.exe': scaricato 'C:\Windows\System32\winrnr.dll'
    'httpGET.exe': scaricato 'C:\Program Files\Bonjour\mdnsNSP.dll'
    'httpGET.exe': scaricato 'C:\Windows\System32\FWPUCLNT.DLL'
    Il thread 'Thread Win32' (0x194c) è terminato con il codice 0 (0x0).
    Il programma '[6372] httpGET.exe: Nativo' è terminato con il codice 0 (0x0).
    Chi mi puo spiegare cosa significa "Impossibile trovare o aprire il file PDB"? Se la libreria è richiesta, e non la trova, non dovrebbe dare errore e non funzionare??

    Ma l'istruzione #pragma comment (lib, "Ws2_32.lib") cosa fa in pratica? Forse dipende da questo la cosa di prima?

    Un grazie ad oregon per l'aiuto.

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    No ... tutti i messaggi sui PDB non trovati non sono errori. Indicano solamente che non ci sono i file dei simboli relativi alle corrispondenti librerie per il debugging.
    Ignorali.

    La pragma (come avresti potuto controllare con google) serve solamente ad indicare al linker quale libreria utilizzare.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.