Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491

    [c++]Socket....concetti!

    Mi sto avvicinando alla programmazione basata sul client/server, sto imparando ad usare le winsocket; consultando la guida
    su MSDN sono riuscito a fare una semplice applicazione basata su un server che "aspetta" la chiamata del cliente che poi gli invia un messaggio...credo di poter riassumere le fasi da implementare in questo modo:
    SERVER:
    1)Creazione della Socket con scela del tipo
    2)Inizializzazione della socket (ip e porta) con "bind"della stessa
    3)Server in ascolto
    4)Ricezione messaggio
    5)Invio risposta al client

    Quella che mi sfugge è questo "bind della socket" che mi resta un pò oscuro...e poi devo inserire l'IP, ma perchè? al server cosa interessa dell'IP non gli basta la porta su cui stare in ascolto?
    grazie per chiarimenti e correzioni!!
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  2. #2
    Quella che mi sfugge è questo "bind della socket" che mi resta un pò oscuro...e poi devo inserire l'IP, ma perchè? al server cosa interessa dell'IP non gli basta la porta su cui stare in ascolto?
    La funzione bind() ha la funzione di assegnare un indirizzo ad un socket. Se il client non sa l'indirizzo del server come gli si potrà connettere? Non devi pensare al server come qualcosa che si affaccia solo sulla rete internet, dato che il modello client-server può avvenire tranqullamente in locale, e in unix i processi funzionano esattamente alla sessa maniera dei socket. In locale tu puoi assegnare indirizzi ip ad un socket che vanno da 10.0.0.0.0 a 192.168.255.255, o con il flag INADDR_ANY impostato nella struttura sockaddr lasciare al sistema la scelta automatica dell'indirizo ip.

    Spero di essere stato chiaro.

    Ciao!
    ..:: by jhon[array] ::..

    ---> jhon[array]'s website

  3. #3
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491

    Grazie....

    Ma il fatto che non capisco è che la funzione bind() è chiamata sulla socket del server, ma perchè devo impostare l'ip del server? Cioè è il client a chiamare la macchina su cui risiede il server, è lui che deve chiamare il "numero" giusto, cosa importa al server l'ip che verrà chiamato dal client? Poi un'altra domanda da niubbo come fa il server a capire che la trasmissione è finita? Mi spiego, il client tramite la funzione send() invia a ripetizioni tanti pacchetti, poi quando ha finito cosa deve fare per far capire al server che ha finito e chiudere la connessione?
    Ciao, grazie.
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  4. #4
    Dunque...
    la bind serve per associare il punto terminale del server al processo server stesso, questo perchè il client sa esattamente a che IP e a che PORT connettersi, ma il processo server creato da UNIX avrà un port ignoto (il primo libero) e indirizzo IP della macchina.
    Ora, la funzione bind serve per associare il punto terminale del server su quella determinata porta. Devi inoltre specificare INADDR_ANY come indirizzo in quanto ti serve per:
    1) se il tuo pc ha più indirizzi IP il server lavorerebbe solo su uno di essi
    2) se devi trasportare il programma server su un'altra macchina avrà uno o più indirizzi IP diversi
    Con INADDR_ANY il programma sa che deve accettare connessioni su qualsiasi indirizzo IP.
    Spero di essere stato chiaro

  5. #5
    Per sapere invece quando ha finito con una trasmissione devi stabilire una sorta di "protocollo di scambio dati". Faccio un esempio: "il server trasmette dati di lunghezza variabile, ma so che l'ultimo carattere che riceverò è un \n" in questo caso fai il controllo sul \n per vedere quando ha finito.
    Puoi usare o inventare altri modi per operare, basta che server e client siano in grado di intendersi.

    PS: quando il client o il server chiude la connessione, l'implementazione del protocollo TCP/IP sull'altra macchina è in grado di accorgersi della chiusura, restituendo un codice d'errore dalle funzioni (rimando al manuale di unix per maggiori dettagli "man funzione")

  6. #6
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Originariamente inviato da zaknafein
    Devi inoltre specificare INADDR_ANY come indirizzo in quanto ti serve per:
    1) se il tuo pc ha più indirizzi IP il server lavorerebbe solo su uno di essi
    2) se devi trasportare il programma server su un'altra macchina avrà uno o più indirizzi IP diversi
    Con INADDR_ANY il programma sa che deve accettare connessioni su qualsiasi indirizzo IP.
    Spero di essere stato chiaro
    Ah ecco questo mi sfuggiva...ora è tutto un pò più chiaro, grazie.
    Ciao
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

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.