Problema Applicazione Client Server c++

di il
21 risposte

Problema Applicazione Client Server c++

Salve a tutti. Ho sviluppato una banalissima applicazione client server.

Il problema è che la connect nel client mi restituisce -1, quindi un errore (errno=58), mentre dal lato server la accept restituisce (0) e riesco a vedere l'indirizzo del client che ha richiesto la connessione come se la connessione la avesse stabilita. Tuttavia essendo che la connect al client abbia restituito errore, credo proprio la connessione stabilita non sia, difatti la applicazione server non riesce poi ad eseguire la recv().

Quale potrebbe essere l'origine del problema? E quale la soluzione? Grazie.

il server è sul PC in ambiente windows, il client su un microprocessore alloggiato su un dispositivo di sincronizzazione IEEE1588.
Se la connect lato client da errore, perché la accept lato server non lo da?

L'errore è ESHUTDOWN. Quindi credo sia la socket del client ad andare in shutdown.
Cosa strana:

Lancio l'applicazione server, poi lancio la applicazione client e il server pare ad esso connettersi, difatti la accept non da errore ed in più il server riesce a leggere correttamente IP e porta del chiamante. Poi non riesce a effettuare la recv() e rimane in attesa. Dal lato client intanto la connect() aveva restituito "-1".

Se poi lascio aperta l'app client e riavvio l'applicazione server, riesce a fare la recv() restituendo però errore.


========================================================
SERVER
========================================================
#include <iostream>
#include <winsock.h>


using namespace std;
int main(int argc, char *argv[]) 
{
int listenSocket;
int remoteSocket;
SOCKADDR_IN Server_addr;
SOCKADDR_IN Client_addr;
int sin_size;
short port;

char buffer[256];

int wsastartup;
int ls_result;
WORD wVersionRequested = 0x0202;
WSADATA wsaData;
wsastartup = WSAStartup(wVersionRequested, &wsaData);
if (wsastartup != NO_ERROR) printf ("Errore WSAStartup()\n\n");
listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listenSocket < 0) printf ("Server: errore nella creazione del socket.\n\n");
else printf ("Creazione server socket correttamente effettuata: socket pronta.\n\n");
port = 6000;

Server_addr.sin_family = AF_INET;
Server_addr.sin_addr.s_addr = inet_addr("169.254.142.1");//inet_addr() converte una stringa contenente un indirizzo IP nella forma opportuna per essere memorizzato nella struttura in_addr.
Server_addr.sin_port = htons(port);

if (bind(listenSocket,(LPSOCKADDR) &Server_addr,sizeof(struct sockaddr)) < 0) 
{
printf ("bind() fallita.\n\n");
closesocket(listenSocket);
system("pause");
return -1;
}
int rec; 
ls_result = listen(listenSocket, SOMAXCONN);
if (ls_result < 0) printf ("Il server non riesce a mettersi in attesa...\n\n");
else printf ("Server in attesa di connessione...\n\n"); 
sin_size = sizeof(struct sockaddr_in);

while (1)
{ 
printf ("\nwhile..."); 
remoteSocket = accept(listenSocket, (struct sockaddr *) &Client_addr, &sin_size);
printf ("remote socket= %d.\n", remoteSocket);
printf ("Connessione al client (IP: %s; PORTA: %d) avvenuta con successo",inet_ntoa(Client_addr.sin_addr),ntohs(Client_addr.sin_port)); 
printf ("\nremote socket= %d.\n", remoteSocket);
rec=recv(remoteSocket, buffer, sizeof(buffer), 0);
printf("\nREC= %d ; errno= %d.", rec, errno);
printf ("\n\nL'identificatore della socket remota e': %d", remoteSocket);
printf ("\n\nMessaggio Arrivato: %s",buffer);
printf ("\n\nIl server sta per essere chiuso.\n\n");
}
WSACleanup();

system("pause");
return 0;
} 
=========================================================
CLIENT
=========================================================
#include <socket.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>




int iprintf(const char *format, ...);


void sample_c_program(void)
{ 


char messaggio[4]="ciao";
iprintf("Benvenuto!\n");
short port;
int clientsocket;
struct sockaddr_in addr;

port=6000;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("169.254.142.1");
addr.sin_port = htons(port);

clientsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
/* if (clientsocket<0)
{
iprintf("Errore nella funzione socket(): %ld\n", errno);
//	return;
}	 */
iprintf("L'identificatore della socket del client è: %d \n", clientsocket);	

int con=-1;
/*	while (con<0)
con=connect(clientsocket, (struct sockaddr*) &addr, sizeof(addr)); 
iprintf("vediamo un po");	 */
if(connect(clientsocket, (struct sockaddr*) &addr, sizeof(addr))<0)
{
iprintf("Errore %d nella connessione con il Server.\n", errno);
// closesocket(clientsocket);
// return;
}	

int bytesSent;

bytesSent=send(clientsocket, messaggio, sizeof(messaggio), 0);
printf( "\n\nBytes Sent: %ld\n", bytesSent );

//	shutdown(clientsocket,2);
//	closesocket(clientsocket);

return;	

}
===================================================================================

21 Risposte

  • Re: Problema Applicazione Client Server c++

    L'accept del server va fuori dal ciclo.
    Qunado ricevi i dati non è detto che tu riceva subito il messaggio,devi controllare che recv ritorni un numero maggiore di 0 altrimenti devi riprovare a ricevere.
    Può darsi che cosi configurato accetti la connessione,recv ti esca senza aver letto dei dati e tu ritorni dinuovo in accept.
    Fai questo passo poi vediamo,e per cortesia usa i tag [ c o d e ] [ / c o d e ]
    Spero per te che tu non stia usando DEV-C++
  • Re: Problema Applicazione Client Server c++

    Grazie, seguirò le tue indicazioni circa la corretta formattazione dei messaggi.
    In ogni caso, ho provato, ma niente... tutto uguale.
    In effetti anche evitando il ciclo tutto rimane uguale: il server che esegue la accept() non restituendo errore ma non riuscendo ad eseguire la recv() ed il client che da errore sulla connect().

    (Inoltre, la applicazione client la ho eseguita su un pc e funziona piuttosto bene (a parte che talvolta non invia correttamente i dati, ma in ogni caso, connect() e accept() non danno problemi).

    Premetto che il microprocessore sul quale è alloggiato il client lo gestisco dal pc (sul quale mi gira il server) attraverso il suo stesso software di sviluppo, fornito dal produttore.
    Ho fatto un tentativo: ho fatto la connect dal client verso il suo stesso indirizzo IP e porta 23 e la connect() non da problemi, così come la send(), cosa che non riesco proprio a giustificare.
  • Re: Problema Applicazione Client Server c++

    Quindi non è il problema non è il codice giusto?
    hai avviato il server e il client sulla stessa macchina con ip 127.0.0.1 e funziona correttamente?
    Non ho però den capito il client su che macchina deve girare,e in che modo è collegato al server.
  • Re: Problema Applicazione Client Server c++

    Sì, il codice, nella sua banalità, pare proprio essere corretto. L'ho scritto così banale soprattutto perché in questa fase mi interessa solo poter appurare la connessione client server.

    In ogni modo, il client è su un modulo di sincronizzazione IEEE1588 (precision time protocol).
    Vd:

    Gestisco questo modulo, in questa fase di sviluppo del software, dal PC, cui è collegato, in seriale, attraverso il suo software di sviluppo che mette a disposizione del programmatore delle API C.

    Il modulo (ce ne saranno poi altri) è collegato via Ethernet con il PC, con in mezzo uno switch.

    Sono circa dieci giorni che dopo aver fatto tante altre interessanti cose mi sono bloccato ad impazzire su questo problema.

    Ripeto, se indico al client di connettersi al server sul PC, il PC pare "vorrebbe" connettersi, accettando la connessione del client e riuscendo anche ad estrapolarne l'indirizzo e la porta, ma in effetti il client ha dato errore nella connect();
    impazzisco anche sul fatto che fornendo al client (modulo) come indirizzo di connessione il suo stesso indirizzo (non quello del PC) e porta 23, la connect() non da errori e nemmeno la send().
  • Re: Problema Applicazione Client Server c++

    Bisogna vedere come è configurata la scheda,e il computer.
    Imposta manualmente l'ip del tuo computer su 192.168.0.1 poi ti provi a collegare dalla scheda a quell'ip e vedi cosa succede.
    Bisogna vedere se la scheda ha una sottospecie di firewall che ti blocca le porte ci vorrebbe il manuale della scheda.Magari è configuara ad ricevere l'ip in modo dinamico e diventa difficile gestire il tutto,dovresti configurargli manualmente il suo ip tipo 192.168.0.2
  • Re: Problema Applicazione Client Server c++

    Vorrei farti notare che il crossposting è vietato
  • Re: Problema Applicazione Client Server c++

    Ho riconfigurato manualmente gli Ip staticamente, tipo 192.168.0.x ma niente, tutto uguale. Il fatto che mi innervosisce è che in un centinaio di volte in cui ho provato a lanciare server e client, senza nulla cambiare né al codice né alla configurazione di rete, due volte ha funzionato tutto correttamente.
  • Re: Problema Applicazione Client Server c++

    C'è qualche problema nel tuo codice.
    Non avendo a disposizione l'occorrente per creare il client ti posto una applicazione client server funzionante sotto windows,dovrai solo modificare nel programma client l'ip che dovrai mettere quello del server,e le relative funzioni non compatibili.

    /// ////// ///
    /// SERVER ///
    /// ////// ///
    Lib:libwsock32.a , libws2_32.a
    
    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <winsock.h>
    
    int main(int argc, char *argv[])
    {
        SOCKET listenSocket;
        SOCKET remoteSocket;
    
        SOCKADDR_IN Server_addr;
        SOCKADDR_IN Client_addr;
    
        int sin_size;
        short port;
    
        char buffer[256];
    
        int wsastartup;
        int ls_result;
        WORD wVersionRequested = 0x0202;
        WSADATA wsaData;
    
        wsastartup = WSAStartup(wVersionRequested, &wsaData);
    
        if (wsastartup != NO_ERROR)
        {
            printf ("Errore WSAStartup()\n\n");
            return -1;
        }
    
        listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    
        if (listenSocket == INVALID_SOCKET)
        {
            printf ("Server: errore nella creazione del socket.\n\n");
            WSACleanup();
            return -1;
        }
        else
            printf ("Creazione server socket correttamente effettuata: socket pronta.\n\n");
    
        port = 6000;
    
        Server_addr.sin_family = AF_INET;
        //ip server
        Server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");//inet_addr() converte una stringa contenente un indirizzo IP nella forma opportuna per essere memorizzato nella struttura in_addr.
        Server_addr.sin_port = htons(port);
    
        if (bind(listenSocket,(LPSOCKADDR) &Server_addr,sizeof(struct sockaddr)) == SOCKET_ERROR)
        {
            printf ("bind() fallita.\n\n");
            closesocket(listenSocket);
            WSACleanup();
            return -1;
        }
    
        int rec;
    
        ls_result = listen(listenSocket, SOMAXCONN);
        if (ls_result != 0)
        {
            printf ("Il server non riesce a mettersi in attesa...\n\n");
            closesocket(listenSocket);
            WSACleanup();
            return -1;
        }
        else printf ("Server in attesa di connessione...\n\n");
            sin_size = sizeof(struct sockaddr_in);
    
        remoteSocket = accept(listenSocket, (struct sockaddr *) &Client_addr, &sin_size);
    
        if (remoteSocket == INVALID_SOCKET)
        {
            printf ("Server: error accept\n\n");
            closesocket(listenSocket);
            WSACleanup();
            return -1;
        }
        else
            printf ("Creazione server socket correttamente effettuata: socket pronta.\n\n");
    
        printf ("remote socket= %d.\n", remoteSocket);
        printf ("Connessione al client (IP: %s; PORTA: %d) avvenuta con successo",inet_ntoa(Client_addr.sin_addr),ntohs(Client_addr.sin_port));
        printf ("\nremote socket= %d.\n", remoteSocket);
    
        while (1)
        {
            rec=recv(remoteSocket, buffer, sizeof(buffer), 0);
            if (rec == SOCKET_ERROR)
            {
                printf("\nerror on message\n");
                continue;
            }
    
            printf("\nmessage:");
            printf("%s",buffer);
            printf("\n");
    
    
            if ( !strcmp(buffer,"exit") ) break;
        }
        WSACleanup();
    
        return 0;
    }
    
    /// ////// ///
    /// CLIENT ///
    /// ////// ///
    Lib:libwsock32.a , libws2_32.a
    
    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <winsock.h>
    
    int main()
    {
    
        printf("Benvenuto!\n");
    
        WORD wVersionRequested = 0x0202;
        WSADATA wsaData;
    
        if (WSAStartup(wVersionRequested, &wsaData) != NO_ERROR)
        {
            printf ("Errore WSAStartup()\n\n");
            return -1;
        }
    
        short port;
        SOCKET clientsocket;
        struct sockaddr_in addr;
    
        port=6000;
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = inet_addr("127.0.0.1");
        addr.sin_port = htons(port);
    
        clientsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    
        printf("L'identificatore della socket del client è: %d \n", clientsocket);
    
        if(connect(clientsocket, (struct sockaddr*) &addr, sizeof(addr)) == SOCKET_ERROR )
        {
            printf("Errore nella connessione con il Server.\n");
            closesocket(clientsocket);
            return -1;
        }
    
        char buffer[100];
        int bytesSent;
    
        while(1)
        {
            printf("send:");
            gets(buffer);
    
            bytesSent = strlen(buffer) + 1;
            bytesSent=send(clientsocket, buffer, bytesSent , 0);
            printf("sended:%d\n",bytesSent);
    
            if ( !strcmp(buffer,"exit") )
            {
                 break;
            }
        }
    
        printf("GoodBye\n");
        closesocket(clientsocket);
        WSACleanup();
        return 0;
    
    }
    
    
  • Re: Problema Applicazione Client Server c++

    Ti ringrazio sempre infinitamente.
    Purtroppo al server mi da errore di compilazione " Circular main_server <- main_server.o dependency dropped. ".
  • Re: Problema Applicazione Client Server c++

    Prova a includere anche <windows.h> prima di winsock
    ma che compilatore usi? che ide usi?
  • Re: Problema Applicazione Client Server c++

    Non era una questione di librerie e tuttora non so quale fosse la questione. Ma ho risolto il problema dell'errore di compilazione banalmente mettendo il codice nel vecchio file. Risoluzione "terra terra" ma efficace.
  • Re: Problema Applicazione Client Server c++

    Non hai risposto alla mia domanda!
    Dato l'errore che hai ricevuto ho la vaga impressione che stai usando quella ciofeca del dev-c++,vorrei poi anche capire in che linguaggio vuoi sviluppare il server,perchè hai scritto le intestazioni come se fosse c++ ma tutto il codice è scritto in c.
  • Re: Problema Applicazione Client Server c++

    In effetti sto usando proprio "quella ciofeca". Cosa mi consigli di usare?
  • Re: Problema Applicazione Client Server c++

    Code::Blocks tra qualche settimana esce anche la nuova versione è in fase di debug.
    scarica la versione con mingw
Devi accedere o registrarti per scrivere nel forum
21 risposte