Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15

Discussione: Problema Socket

  1. #1

    Problema Socket

    Salve,
    Sto cercando di sviluppare una pagina php che comunica con programma scritto in c che gira su una macchina diversa dal server su cui si trova la pagina php. Su localhost sono riuscito a far andare tutto senza problemi, ma quando ho spostato la pagina sul web sono iniziati i problemi. In pratica la pagina inizia il caricamento e dopo qualche minuti mi chiede di scaricare lo script php.

    Codice PHP:
    <?php
            $host
    =//mio ip
            
    $port=10000;

            
    $socket socket_create(AF_INETSOCK_STREAM0) or die("Could not create socket\n");
            echo 
    "Tentativo di connessione a '$host' sulla porta '$port'...";
            
    $result socket_connect($socket$host$port);
            
            if (
    $result 0) {
               echo 
    "socket_connect() fallito.\nMotivo: ($result) " socket_strerror($result) . "\n";
            } else {
               echo 
    "OK.\n";
            }
            
    $in "aumentapotenza";
            echo 
    "Invio...";
            
    socket_write($socket$instrlen ($in)) or die("Could not write output\n");

            echo 
    "Chiusura del socket...";
            
    socket_close($socket);
            echo 
    "OK.\n\n";
    ?>
    vi allego anche il codice c nel caso possa aiutarvi
    codice:
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
     
    int main(int argc, char *argv[])
    {
    	int id;
    	int SPORT = 10000;	// Porta TCP Server
    	int server, client;
    	struct sockaddr_in server_addr;
    	struct sockaddr_in client_addr;
    	int client_len = sizeof(client_addr), byte;
    	char buffer[1000];
     
    	//	Struttura con le informazioni sul server per effettuare il BIND
    	server_addr.sin_family = AF_INET;
    	server_addr.sin_port = htons((u_short) SPORT);
    	//server_addr.sin_addr.s_addr = INADDR_ANY;
    	server_addr.sin_addr.s_addr = inet_addr("mio ip");; 
    
    	server = socket (AF_INET, SOCK_STREAM, 0);
    	if (server < 0)
    	{
    		printf ("\n\n");
    		perror (buffer);
    		printf ("\n\n");
    	}
     
    
    	//	Il BIND associa al socket una porta
    	bind (server,(struct sockaddr*)&server_addr,sizeof(server_addr));
    
    
    	listen(server,1);
    
    	while(1) {
    	//	L'applicazione rimane in attesa di connessione
    	client = accept (server,(struct sockaddr*) &client_addr, &client_len);
    	
    
    		if (client >= 0)
    		{
    			byte = recv(client,buffer,200,0);		
    			buffer[byte] = '\0';
    			printf("\n\nClient: %s \n\n\n",buffer);
    		}
    		else
    		{
    			perror (buffer);
    		}
     	}
    	//	Chisura socket
    	close (client);
    	close (server);
    }

  2. #2
    domanda #1:
    riesci a connettertici tramite un telnet?

    domanda #2:
    dato che devi fare una cosa abb. semplice perché non usi fsockopen?

    credo, comunque, che il problema stia in socket_create! non hai specificato il tipo di protocollo da utilizzare, in questo caso SOL_TCP (mi sembra anche che in C ci sia lo stesso problema ... in ogni caso prima di modificare qualunque cosa prova a connettertici manualmente alla socket del programma C)

  3. #3
    Innanzitutto grazie per la tua risposta.

    Per connettermi manualmente intendi sempre con telnet?
    Non sono molto pratico di telnet, mantenendo la stessa porta non riuscivo a collegarmi. Cambiandola però a 80 si è connesso, ma penso di non essermi connesso al socket anche perché ricevo questo errore quando invio un comando:
    codice:
    HTTP/1.0 400 Bad Request
    Content-Type: text/html
    Cache-Control: public
    Pragma: cache
    Expires: Wed, 26 Aug 2009 22:37:41 GMT
    Date: Wed, 26 Aug 2009 22:07:41 GMT
    Last-Modified: Wed, 26 Aug 2009 22:07:41 GMT
    Accept-Ranges: bytes
    Connection: close
    
    <html>
    <head>
      <title>400 Bad Request</title>
    </head>
    <body bgcolor="ffffff">
      <h2>400 Bad Request<h2>
      
    
    
      
    </body>
    </html>

    Ho poi provato ad usare fsockopen(), con il risultato che invece di chiedermi il download dello script compare l'errore per timout.
    Infine ho corretto socket_create usando SOL_TCP ma anche con questo non è cambiato nulla ...

  4. #4
    scusa, ma il programma in C lo hai scritto tu?

    che c'entra il connettersi alla porta 80 il tuo lavora alla 10000 .... se ti connetti alla 80 ti connetterai probabilmente ad un webserver locale o a qualche altro servizio che usa http (vedendo la risposta data)

    probabilmente c'è lo stesso problema anche in C! La funzione che usi per inizializzare la socket manca del tipo di incapsulamento da utilizzare (UDP, TCP, RAW e cosi via) che se non specificato non farà funzionare correttamente le cose

  5. #5
    server = socket (AF_INET, SOCK_STREAM, 0);

    questa funzione è ben giusta così, specificando il tipo come sock_stream riconosce da solo il protocollo da usare, in questo caso tcp. Cmq si l'ho scritto io il programma, ma se cambio l'ip con localhost e faccio girare la pagina sul mio server apache funziona il programma. Potrebbe esserci qualche problema con il firewall?


    Edit: C'era un errore nel programma C, dovevo scrivere server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    Ora con due programmi scritti in C riesco a comunicare, ma con il php ancora niente, non è che il server abbia una configurazione che non supporti i socket?

  6. #6
    beh, si, direi che il problema è probabilmente il firewall a questo punto

    se non ti funziona può essere solo perché non passa la comunicazione

    il programma in C mi sembra scritto seguendo lo standard posix, non vedo api di windows, quindi sta su linux (o alternativamente magari gira su windows compilato con le mingw)

    controlla il firewall, se è windows lo disabiliti temporaneamente e via, mentre se la macchina su cui gira tutto è linux lancia un iptables -L come root e guarda se la policy di default è di bloccare i pacchetti in ingresso o ci stanno regole che ti bloccano il passaggio dei pacchetti tranne che per certe specifiche porte

  7. #7
    Originariamente inviato da Simox1988
    Edit: C'era un errore nel programma C, dovevo scrivere server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    Ora con due programmi scritti in C riesco a comunicare, ma con il php ancora niente, non è che il server abbia una configurazione che non supporti i socket?
    per semplicità, perché non provi ad usare fsockopen? ti semplificheresti parecchio la vita dato che devi fare delle operazioni tutto sommato semplici

  8. #8
    ho scritto (copiato) questo script che usa fsockopen():
    Codice PHP:
    $fp fsockopen ("xx.xxx.xx.xx"10000$errno$errstr30);
            if (!
    $fp) {
                echo 
    "$errstr ($errno)
    \n"
    ;
            } else {
                
    fputs ($fp"GET / HTTP/1.0\r\nHost: [url]www.php.net\r\n\r\n[/url]");
                while (!
    feof($fp)) {
                    echo 
    fgets ($fp,128);
                }
                
    fclose ($fp);
            } 
    l'ip è quello pubblico su cui gira il server. Inizialmente il mio router bloccava le connessioni su quella porta, poi ho sistemato. Ho testato il programma in c più volte e sono sicuro che funziona, invece lo scipt in php l'ho fatto girare sul mio server apache in localhost funziona, sullo spazio web invece ricevo questo errore:

    Warning: fsockopen() [function.fsockopen]: unable to connect to xx.xx.xx.xx:10000 (Connection timed out) in /home/a6514833/public_html/inviadati.php on line 37

    Connection timed out (110)

    A questo punto penso che ci sia un firewall sul server web che blocchi la connessione, possibile?

  9. #9
    è probabile che ci sia un firewall in uscita per bloccare l'accesso alle porte non standard

    prova a girare la 80, la 110, la 443 o simili (la 25 potrebbe essere bloccata dal tuo ISP, telecom ad esempio lo faceva e non so se lo fà ancora)

  10. #10
    ho provato un'infinità di porte ma non ne va neanche una, l'errore rimane lo stesso.
    tra le info del server ho visto che i socket sono abilitati
    Sockets Support enabled
    quindi non capisco perché dovrebbero bloccare le porte.
    In alternativa sapresti consigliarmi qualche metodo con cui posso passare una stringa da una pagina web a una macchina (che non è un pc, ma gira sotto linux) di cui conosco solo l'ip?

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.