Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Error LNK2019 Visual studio
Forum - C/C++ - Error LNK2019 Visual studio

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
pocho183 (Normal User)
Rookie


Messaggi: 30
Iscritto: 22/02/2013

Segnala al moderatore
Postato alle 17:26
Venerdì, 22/02/2013
Ho fatto un client e un server che mi danno i seguenti errori:

error LNK2019: riferimento al simbolo esterno _WSACleanup@0 non risolto nella funzione _main    c:\Users\...
error LNK2019: riferimento al simbolo esterno _recv@16 non risolto nella funzione _main c:\Users\................\documents\visual studio 2010\Projects\Client\Client\Client.obj

sono 10 e si riferiscono a connect,inet addr htons ecc.
Ho guardato sul web, ho trovato che è un errore del linker, ma non so risolvere.
Questo è il client:

/* Client.c */

#include <winsock.h>
#include <stdlib.h>
#include <stdio.h>
#define MAX_LINE       (1000)

int main(int argc, char *argv[]) {
        printf("Avvio client in corso...\n");
        WSADATA   wsaData;
        u_long    nRemoteAddr;
        char     *szAddress;             /*  Holds remote IP address   */
        struct sockaddr_in target;
        struct sockaddr_in accepted;
        struct      hostent *hp;
        int acceptedLen;  // accept scriverà la propria taglia
        char buffer[MAX_LINE];      /*  character buffer          */
        
        if (WSAStartup(MAKEWORD(1,1), &wsaData) != 0) {  // Affinchè, windows utilizzi i socket devo mandare in startup il layer dei socket
        printf("errore in WSAStartup()\n");
        exit(EXIT_FAILURE);
    }
                /* Creo il socket */
        SOCKET sock;
        SOCKET newSock;
        printf("\nCreazione socket in corso...");
        sock=socket(AF_INET, SOCK_STREAM, 0);

        /*  Inizializzo la struttura  */

        memset(&target, 0, sizeof(target));
        target.sin_family = AF_INET;
        target.sin_port = htons(1999);

        /*  Set the remote IP address  */

    nRemoteAddr = inet_addr(szAddress);
    if (nRemoteAddr == INADDR_NONE)
    {
        printf("client: indirizzo IP non valido.\nclient: risoluzione nome...");
        if ( (hp=gethostbyname(szAddress)) == 0)
        {
            printf("fallita.\n");
              exit(EXIT_FAILURE);
        }
        printf("riuscita.\n\n");
        nRemoteAddr = *((u_long *)hp->h_addr_list[0]);
    }
    target.sin_addr.s_addr = nRemoteAddr;
    
    /*  Connessione  */

    if ( connect(sock, (struct sockaddr *) &target, sizeof(target) ) == SOCKET_ERROR )
    {
        printf("client: errore durante la connect.\n");
        exit(EXIT_FAILURE);
    }


        /*  Comunicazione  */

    printf("Inserire la stringa da spedire: ");
    do {
        scanf("%s",buffer);
        send(sock,buffer,strlen(buffer),0);
    } while (strcmp(buffer,"quit")!=0);
    recv(sock,buffer,MAX_LINE-1,0);
    printf("Risposta del server: %s\n",buffer);

    WSACleanup();
    return EXIT_SUCCESS;
}

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 17:35
Venerdì, 22/02/2013
Devi assicurarti che le librerie che ti servono siano linkate, contralle quali librerie ti servono ed aggiungile (opzioni->progetto->C/C++->Linker) o qualcosa del genere.

PM Quote
Avatar
pocho183 (Normal User)
Rookie


Messaggi: 30
Iscritto: 22/02/2013

Segnala al moderatore
Postato alle 20:19
Venerdì, 22/02/2013
Non ho previsto nessuna libreria aggiuntiva il codice è solo quello che ho postato

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 23:52
Venerdì, 22/02/2013
Devi linkare ws2_32.lib che e' la libreria per le winsockets.


Il mio blog: https://piero.dev
PM Quote
Avatar
pocho183 (Normal User)
Rookie


Messaggi: 30
Iscritto: 22/02/2013

Segnala al moderatore
Postato alle 8:42
Sabato, 23/02/2013
In quel modo ho risolto tutti gli errori tranne uno, questo(Sul server):

error LNK2019: riferimento al simbolo esterno _main non risolto nella funzione ___tmainCRTStartup    C:\Users\...........\Documents\Visual Studio 2010\Projects\Server\Server\MSVCRTD.lib(crtexe.obj)

Qui di seguito posto il server:

#include <stdlib.h>
#include <stdio.h>
#define LISTENQ        (1024)
#define MAX_LINE       (1000)

void startServer(char** argv){
        #pragma comment(lib, "ws2_32.lib") // Risolve problemi con il Linker tipo LNK2019.
        printf("Avvio server in corso...\n");
        WSADATA   wsaData;
        struct sockaddr_in target;
        struct sockaddr_in accepted;
        int acceptedLen;  // accept scriverà la propria taglia
        char buffer[MAX_LINE];      /*  character buffer          */

        if (WSAStartup(MAKEWORD(1,1), &wsaData) != 0) {  // Affinchè, windows utilizzi i socket devo mandare in startup il layer dei socket
        printf("errore in WSAStartup()\n");
        exit(EXIT_FAILURE);
    }


        /* Creo il socket */

        SOCKET sock;
        SOCKET newSock;
        printf("\nCreazione socket in corso...");
        sock=socket(AF_INET, SOCK_STREAM, 0);

/* Stabilisco l'indirizzo IP del server secondo argomento da linea di comando, il protocollo utilizzato e il port number (terzo argomento da linea di comando*/
        memset(&target, 0, sizeof(target));
        target.sin_family = AF_INET;
        target.sin_port = htons(1999);                   // l'argomento di htons deve essere un intero, uso atoi che converte da stringa a intero;
        target.sin_addr.s_addr = htonl(INADDR_ANY);               //argv[2] è la porta; htons converte il numero di porta voluto, perchè i valori utilizzati
                                                                  //da internet sono diversi da quelli del pc.
        
        /* Effettuo il bind */

        printf("\nBind in corso...");
        if(bind(sock,(struct sockaddr *)&target, sizeof(target))==-1){
            printf("Errore nel bind");
        }

        /* Mi metto in ascolto */                

if(listen(sock,LISTENQ) ==SOCKET_ERROR) { // listenq sono il numero di connessioni sospese
    printf("server: Errore durante la listen");
    exit(EXIT_FAILURE);
}

                /* Creo un nuovo socket per la connessione del singolo client */

                while(1) {
                printf("\nSono in attesa di una connessione...\n");
                if((newSock = accept(sock, (struct sockaddr *) &accepted, &acceptedLen))!=-1){ // accept = attesa dionnessione
                        printf("\nErrore: Impossibile creare un nuovo socket!\nConnessione fallita\n");
                }

                /* Primo contatto con il client */

        printf("server: connessione da %s:%d\n", inet_ntoa(accepted.sin_addr),accepted.sin_port);
        do {
        recv(newSock, buffer, MAX_LINE-1,0);
        printf("Messaggio del client=%s\n",buffer);
        } while (strcmp(buffer,"quit")!=0);
        send(newSock, "letto", strlen(buffer),0);
        exit(0);
                }


        /*  Close the connected socket  */

        if ( closesocket(newSock) == SOCKET_ERROR )
        {
            fprintf(stderr, "server: errore durante la close.\n");
            exit(EXIT_FAILURE);
        }

    if ( closesocket(sock) == SOCKET_ERROR )
    {
        fprintf(stderr, "server: errore durante la close.\n");
        exit(EXIT_FAILURE);
    }
    WSACleanup();

}

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 15:50
Sabato, 23/02/2013
Dov'e' il tuo main()?


Il mio blog: https://piero.dev
PM Quote
Avatar
pocho183 (Normal User)
Rookie


Messaggi: 30
Iscritto: 22/02/2013

Segnala al moderatore
Postato alle 16:12
Sabato, 23/02/2013
sul client,devo metterlo anche nel server e eliminare il void?

PM Quote
Avatar
pocho183 (Normal User)
Rookie


Messaggi: 30
Iscritto: 22/02/2013

Segnala al moderatore
Postato alle 16:26
Sabato, 23/02/2013
ho risolto grazie.
Sul client mi da questo output, cosa significa?
'Client.exe': caricato 'C:\Windows\SysWOW64\ntdll.dll', Impossibile trovare o aprire il file PDB
'Client.exe': caricato 'C:\Windows\SysWOW64\kernel32.dll', Impossibile trovare o aprire il file PDB
'Client.exe': caricato 'C:\Windows\SysWOW64\KernelBase.dll', Impossibile trovare o aprire il file PDB
'Client.exe': caricato 'C:\Windows\SysWOW64\ws2_32.dll', Impossibile trovare o aprire il file PDB
'Client.exe': caricato 'C:\Windows\SysWOW64\msvcr100d.dll', Simboli caricati.
'Client.exe': caricato 'C:\Windows\SysWOW64\rpcrt4.dll', Impossibile trovare o aprire il file PDB
'Client.exe': caricato 'C:\Windows\SysWOW64\nsi.dll', Impossibile trovare o aprire il file PDB
'Client.exe': caricato 'C:\Windows\SysWOW64\sspicli.dll', Impossibile trovare o aprire il file PDB
'Client.exe': caricato 'C:\Windows\SysWOW64\cryptbase.dll', Impossibile trovare o aprire il file PDB
'Client.exe': caricato 'C:\Windows\SysWOW64\sechost.dll', Impossibile trovare o aprire il file PDB
'Client.exe': caricato 'C:\Windows\SysWOW64\bcryptprimitives.dll', Impossibile trovare o aprire il file PDB
Il programma '[1264] Client.exe: Nativo' è terminato con il codice 0 (0x0).

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 17:23
Sabato, 23/02/2013
Fai il debug, riga per riga finchè scopri cosa non va

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo