Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di dave88
    Registrato dal
    Dec 2002
    Messaggi
    55

    [C++][Socket] Tempo di risposta...

    Allora ho un piccolo problema, ho fatto in C++ un programma che deve connettersi ad un indirizzo, su una determinata porta, per verificare, se effettivamente esiste l'indirizzo o meno. Il tutto funziona, ma in caso esiste l'indirizzo, il programma continua subito la sua esecuzione, in caso l'indirizzo non esiste(perche io inserisco volutamente un indirizzo inventato), ci impiega circa 1 minuto prima di proseguire il programma,...come posso ridurre questo tempo?
    Da quanto ho capito, il programma effettua diverse prove di connessione durante quel tempo...come posso impedirgli di farne cosi tante?

    Grazie, Dave88

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Dovresti impostare un timeout diverso per la connessione ...

    Mostra il codice che usi ...

  3. #3
    Utente di HTML.it L'avatar di dave88
    Registrato dal
    Dec 2002
    Messaggi
    55
    Allora posto la parte di codice...

    codice:
    ...
    
    SOCKET sock;
    struct sockaddr_in sock_addr;
    WSADATA data;
    WORD p;
    p=MAKEWORD(2,0);
    
    WSAStartup(p,&data);
    sock=socket(PF_INET,SOCK_STREAM,0);
    sock_addr.sin_family=PF_INET;
    
    
    sock_addr.sin_port=htons(21);
    sock_addr.sin_addr.s_addr= inet_addr("127.0.0.1");
    cout << "Prova di connessione su porta " << htons(sock_addr.sin_port) << "\n";
    err = connect(sock,(struct sockaddr*)&sock_addr,sizeof(struct sockaddr));
        if (err != 0) { cout << "Indirizzo non valido"; } else { cout << "Indirizzo valido"; }
    
    closesocket(sock);
    WSACleanup();
    
    ...
    Spero possiate darmi una mano...

  4. #4
    Utente di HTML.it L'avatar di dave88
    Registrato dal
    Dec 2002
    Messaggi
    55
    provo un piccolo up
    Mi sono un po informato, ed ho letto qualcosa sull'uso di una funzione select(), ma non so come usarla.

  5. #5
    Utente di HTML.it L'avatar di dave88
    Registrato dal
    Dec 2002
    Messaggi
    55
    piccolo up....

  6. #6
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201
    Ciao!
    Potresti usare la funzione alarm

    codice:
    #include <unistd.h>
    void alarm( unsigned int seconds)
    Questa funzione imposta una sveglia nel sistema operativo.
    Quando arriva il momento, il So invia all'applicazione il segnale SIGALRM, che sblocca il programma da quanlunque chiamata bloccante stesse facendo il quel momento (ad esempio la connect).
    La reazione predefinita a SIGALRM è la terminazione del processo, per cui occorre registrare un signal_handler mendiante la funzione signal.

    codice:
    #include <signal.h>
    signal (int segnale, void (*nomefunzione)(int))
    Ricapitolando, scrivi una funzione di quetso tipo:

    codice:
    void sveglia (int x)
    {
      /* non faccio nulla, evito solo che il processo sia ucciso */
    }
    La registri prima di chiamare la alarm

    codice:
    signal (SIGALRM, sveglia);
    chiami la alarm prima della connect

    codice:
    alarm (15); //15 secondi di timeout
    Dimmi se riesci, ciao!

  7. #7
    Utente di HTML.it L'avatar di dave88
    Registrato dal
    Dec 2002
    Messaggi
    55
    Mi dice che alarm e undeclared, ah tra l'altro lasciando
    codice:
    signal (SIGALRM, sveglia);
    mi diceva che anche SIGALRM era undeclared, allora ho sostituito con:
    codice:
    signal ('SIGALRM', sveglia);
    ma mi dice che alarm e undeclared...ho incluso unistd.h ma non cambia... e se uso
    codice:
    #include <unistd.h>
    void alarm( unsigned int seconds);
    mi da:
    [Linker error] undefined reference to `alarm(unsigned int)'

    ho bisogno di aiuto...pls

  8. #8
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201
    Pensavo stessi lavorando su Unix/Linux, mi spiace ma non conosco ancora abbstanza bene la parte di rete per Windows.
    In ogni caso puoi simulare un comportamento simile con la funzione raise.
    In questi caso devi usare un segnale tra questi:

    codice:
    SIGABRT
    SIGFPE
    SIGILL
    SIGINT
    SIGSEGV
    SIGTERM
    Prova con sigint e ricordati di registrare l'handler con la signal.
    N.B.: Questa procedura è sconsigliatissima perché è tipica di Unix e non di Win, l'ideale sarebbe trovare una funzione timeout che sblocca le chiamate bloccanti dopo il tempo stabilito e che io non conosco.
    Non ho mai provato a fare una cosa simile sotto windows e non sono nemmeno sicuro che funzioni.

    In ogni caso

    codice:
    #include <signal.h>
    
    int raise(
       int sig 
    );
    
    void (__cdecl *signal(
       int sig, 
       void (__cdecl *func ) (int [, int ] ))) 
       (int);
    La signal riceve un intero (il segnale) ed un puntatore a funzione di tipo void func (int)

  9. #9
    Utente di HTML.it L'avatar di dave88
    Registrato dal
    Dec 2002
    Messaggi
    55
    mi spiace ma cio che hai scritto non lo capisco bene, piuttosto nessuno sa come farlo? tramite le funzioni dei socket magari? Grazie in anticipo e grazie a ibycos.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.