Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408

    [C] Client-Server non funziona da pc diversi

    Salve a tutti, grazie ad alcune dispense online e qualche tutorial ho creato un server e un client di base, in C, con le winsock. Funziona tutto bene, sul mio PC. Ho provato ad inviare il client ad un mio amico su un altro pc, e ho lasciato il server sul mio. Ma non si connette. Come mai? Sono abbastanza ignorante in materia, quindi forse ho detto una mega-castroneria, se è così non andateci troppo pesante
    Se serve saperlo, eravamo tutti e due su Windows.

    Il server è questo:
    codice:
    #include <stdio.h>
    #include <winsock.h>
    
    void main(){
        /* 
        La funzione WSASTARTUP restituisce 0 in caso di successo, 
        altrimenti un codice di errore. 
        */
        WSADATA wsaData;
        int iResult;
        iResult=WSAStartup(MAKEWORD(2, 2), &wsaData);
        if(iResult!=NO_ERROR)
            printf("Error at WSAStartup.\n");
        
        /* 
        La funzione SOCKET restituisce un intero che è un descrittore 
        che referenzia la nuova socket in caso di successo.
        Altrimenti restituisce un codice di errore. 
        */
        SOCKET m_socket;
        m_socket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if(m_socket==INVALID_SOCKET){
            printf("Error at socket(): %ld.\n", WSAGetLastError());
            WSACleanup();
            return;    
        }
        
        /*
        La struttura SOCKADDR_IN specifica l'address family, l'indirizzo IP
        e il numero di porta per il socket.
        La funzione BIND associa un nome alla socket creata in precedenza e
        restituisce 0 in caso di successo, altrimenti un codice di errore.
        */
        SOCKADDR_IN service;
        service.sin_family=AF_INET;
        service.sin_addr.s_addr=inet_addr("127.0.0.1");
        service.sin_port=htons(27015);
        if(bind(m_socket, (SOCKADDR*) &service, sizeof(service))==SOCKET_ERROR){
            printf("bind() failed.\n");
            closesocket(m_socket);
            return;    
        }
        
        /*
        La funzione LISTEN setta la socket in uno stato in cui rimane in attesa
        di richiesta di connessioni. Restituisce 0 in caso di successo, altrimenti
        un codice di errore. Come parametri riceve la socket creata e il numero
        massimo di connessioni che accetta.
        */
        if(listen(m_socket, 1)==SOCKET_ERROR)
            printf("Error at listen().\n");
            
        /*
        La funzione ACCEPT consente un tentativo di connessione in entrata su
        una socket. La funzione estrae la prima connessione dalla coda delle
        connessioni sul socket. Successivamente crea e restituisce un
        riferimento ad una nuova socket. Questa nuova socket è quella che 
        abbiamo chiamato socket di connessione e mantiene le stesse proprietà
        della socket di partenza.
        */
        SOCKET AcceptSocket;
        printf("Waiting for a client to connect..\n");
        while(1){
            AcceptSocket=SOCKET_ERROR;
            while(AcceptSocket==SOCKET_ERROR){
                AcceptSocket=accept(m_socket, NULL, NULL);    
            }    
            printf("Client Connected.\n");
            m_socket=AcceptSocket;
            break;
        }
        
        /*
        La funzione SEND invia dati ad una socket connessa. La funzione
        restituisce il numero di byte trasmessi in caso di successo.
        Altrimenti, un codice di errore.
        La funzione RECEV riceve dati da una socket connessa.
        */
        int bytesSent;
        int bytesRecv=SOCKET_ERROR;
        char sendbuf[32]="Server: Sending Data.";
        char recvbuf[32]="";
        
        bytesRecv=recv(m_socket, recvbuf, 32, 0);
        printf("Bytes Received: %ld\n", bytesRecv);
        bytesSent=send(m_socket, sendbuf, strlen(sendbuf), 0);
        printf("Bytes Sent: %ld\n", bytesSent);
        
        return;
    }
    Il client è questo:
    codice:
    #include <stdio.h>
    #include <winsock.h>
    
    void main(){
        /* 
        La funzione WSASTARTUP restituisce 0 in caso di successo, 
        altrimenti un codice di errore. 
        */
        WSADATA wsaData;
        int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
        if (iResult != NO_ERROR)
        printf("Error at WSAStartup()\n");
        
        /* 
        La funzione SOCKET restituisce un intero che è un descrittore 
        che referenzia la nuova socket in caso di successo.
        Altrimenti restituisce un codice di errore. 
        */
        SOCKET ConnectSocket;
        ConnectSocket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if(ConnectSocket==INVALID_SOCKET){
            printf("Error at socket(): %ld\n", WSAGetLastError());
            WSACleanup();
            return;
        }
        
        /*
        La struttura SOCKADDR_IN specifica l'address family, l'indirizzo IP
        e il numero di porta per il socket.
        La funzione CONNECT stabilisce una connessione ad una socket specificata.
        */
        SOCKADDR_IN clientService;
        clientService.sin_family=AF_INET;
        clientService.sin_addr.s_addr=inet_addr("127.0.0.1");
        clientService.sin_port=htons(27015);
        if(connect(ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService))==SOCKET_ERROR){
            printf("Failed to connect.\n");
            WSACleanup();
            return;
        }
        
        /*
        La funzione SEND invia dati ad una socket connessa. La funzione
        restituisce il numero di byte trasmessi in caso di successo.
        Altrimenti, un codice di errore.
        La funzione RECEV riceve dati da una socket connessa.
        */
        int bytesSent;
        int bytesRecv=SOCKET_ERROR;
        char sendbuf[32]="Server: Sending Data.";
        char recvbuf[32]="";
        
        bytesSent=send(ConnectSocket, sendbuf, strlen(sendbuf), 0);
        printf("Bytes Sent: %ld\n", bytesSent);
        if(bytesRecv==0 || (bytesRecv==SOCKET_ERROR && WSAGetLastError()==WSAECONNRESET)){
            bytesRecv=recv(ConnectSocket, recvbuf, 32, 0);
            if(bytesRecv==-1){
                printf("Connection Closed.\n");   
            }
            if(bytesRecv<0){
                return;    
            }
            printf("Bytes Received: %ld\n", bytesRecv);
        }
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Riassumi la situazione della rete del server ... sei dietro ad un router? Il client si connette ad una specifica porta? E' aperta sul router del server?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Si, sono su un router, ma l'amico in questione non si "lega" al mio router. E' questo il problema? La porta è la 27015.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Sì ... devi aprire la porta in questione sul tuo router altrimenti nessuno potrà collegarsi.

    E' una questione di configurazione di rete non di programmazione.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Originariamente inviato da oregon
    Sì ... devi aprire la porta in questione sul tuo router altrimenti nessuno potrà collegarsi.

    E' una questione di configurazione di rete non di programmazione.
    Sai dirmi come aprire una determinata porta sul router? Sono a digiuno su queste cose..
    Comunque scusate se ho sbagliato sezione

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Dipende esclusivamente dal tuo router. Ogni marca/modello ha un modo diverso. Collegati tramite l'interfaccia di gestione (web, telnet ...) e cerca l'opzione corretta.
    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.