UDP depuis serveur Free

Bonjour à tous,

J ai un petit bout de code qui fait un fader sur une diode via une commande ethernet UDP depuis un serceur php qui tourne en local sur mon pc.

Le PC et la carte arduino avec le shield ethernet sont branchés sur une freebox revolution en mode router.

Mon problème, ca fonctionne très bien dans cette config, meme depuis l'exterieur, mais j aimerais héberger tout ca sur un serveur Free pour ne pas laisser mon PC tourner.

Voici l erreur que je rencontre :

socket_sendto() [function.socket-sendto]: unable to write to socket [101]

<?php //phpinfo(); //$valeur_led = $_POST["led1"]; // récupération de la valeur transmise en méthode POST $valeur_led ="59"; $host="88.167.XXX.XXX"; // Adresse ip défini dans le code arduino $port=8888; // Port défini dans le code arduino $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_sendto($socket, $valeur_led , strlen($valeur_led), 0, $host, $port); echo socket_last_error(); echo " "; echo socket_strerror(socket_last_error()); socket_close($socket); ?>

le Ino:

#include <SPI.h> // needed for Arduino versions later than 0018
#include <Ethernet.h>
#include <EthernetUdp.h> // UDP library from: bjoern@cs.stanford.edu 12/30/2008

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
uint8_t hwaddr[6] = {0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xBE}; // mac-adress of arduino
//uint8_t ipaddr[4] = {192, 168, 0, 10}; // IP-adress of arduino
uint8_t ipaddr[4] = {88,167,233,135}; // IP-adress of arduino
uint8_t gwaddr[4] = {192, 168, 0, 254}; // IP-adress of gateway ( for later DNS implementation)
uint8_t dns[4] = {192, 168, 0, 254}; // IP-adress of gateway ( for later DNS implementation)
uint8_t subnet[4] = {255, 255, 255, 0}; // subnetmask ( for later DNS implementation)
//uint8_t serverip[4] = {88,167,233,135}; // IP-adress of server arduino sends data to
//uint8_t ipaddr[4] = {192, 168, 0, 10};

unsigned int localPort = 8888; // local port to listen on

// the next two variables are set when a packet is received
byte remoteIp[4]; // holds received packet's originating IP
unsigned int remotePort; // holds received packet's originating port

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
char ReplyBuffer[] = "acknowledged"; // a string to send back
EthernetUDP Udp;
void setup() {
// start the Ethernet and UDP:
Ethernet. begin(hwaddr,ipaddr,dns,gwaddr,subnet); // start up ethernet

Udp.begin(localPort);

Serial.begin(9600);
}

void loop() {
// if there's data available, read a packet
int packetSize = Udp.parsePacket();
if(packetSize)
{
Serial.print("Received packet of size ");
Serial.println(packetSize);
Serial.print("From ");
IPAddress remote = Udp.remoteIP();
for (int i =0; i < 4; i++)
{
Serial.print(remote*, DEC);*

  • if (i < 3)*

  • {*

  • Serial.print(".");*

  • }*

  • }*

  • Serial.print(", port ");*

  • Serial.println(Udp.remotePort());*

  • memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);*

  • // read the packet into packetBufffer and get the senders IP addr and port number*

  • Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);*

  • Serial.println("Contents:");*

  • Serial.println(packetBuffer);*

  • analogWrite(9, atoi(packetBuffer)); //utiliser la valeur reçu pour allumer la led*

  • }*

  • //delay(250);*
    }
    [/quote]
    Ca fait 3 jours que je cherche dans mon code et sur le net, ma box est bien paramétrée pour rediriger les port (enfin je crois :wink: )
    Si quelqu un a une idée, Skywood si tu passes dans le coin...
    Merci à tous

bonjour,
as tu essayé déjà via le port 80 pour tester?
est ce bien l'UDP qui est sélectionné pour le port et non le TCP.
avant il fallait rebooter la FB pour terminer la config des ports, je sais pas si c'est toujours d'actu.
regarde ce tuto pour emule
http://routeurs.emule-french.org/freeboxv6.php

Merci pour ta reponse infobarquee.

Sur le port 80 j ai une redirection vers mon PC avec le serveur Wamp ceci dit, je pourrais le cutter.

Je n ai pas essayé de reboot la box, ce n'est a priori pas nécessaire mais je vais essayer aussi.

j ai a peu près tout essayé donc je tente tout ce que je n ai pas deja fait :wink:

@+

Salut,

Je suis pas trés fort quand il s'agit d'udp m'enfin ...

Est ce que tu as bien routé le port 8888 en udp vers ton arduino dans la configuration de ta freebox ?
Est ce que ta freebox est en IPV4 ou en IPV6 ?

Rajoute un test if($socket === false) pour avoir un retour sur erreur de socket_create() :
http://www.php.net/manual/fr/function.socket-last-error.php

Sinon si tu veut pas te casser la tête il existe fsocketopen() qui est plus simple à utiliser :
http://php.net/manual/fr/function.fsockopen.php

D'aprés le phpinfo de free : phpinfo() aucune restriction n'est en place donc pas de probléme de ce cote là.

La grande majorité des hébergeurs mutualisés n'accepte tout simplement pas les socket, même activé niveau php.

Pour free particulièrement, une rapide recherche m'a permis de trouvé ça.

Réponse de l'Assistance Mail de Free :

Cher utilisateur,

Nous vous confirmons que les fonctions de sortie en port 80 ne sont plus disponibles sur les pages perso FREE depuis le 01/12/08.

La fonction fopen() ne peut plus fonctionner que sur des fichiers locaux et pas des URL.

Les autres fonctions désactivées sont notamment :

  • fsockopen()
  • file_get_contents()
  • curl()
  • readfile()
  • file()
  • allow_url_open()

Nous restons à votre entière disposition pour toute information complémentaire et je vous souhaite une bonne journée.

Cordialement.
Marc, Service Mailer Free

@Skywodd, je t ai fait un petit MP avec le lien de phpsecureinfo sur mon serveur free.

Ma box est en IPV6, ca pose un problème?

Si tu regarde mon code, j affiche deja le code erreur :unable to write to socket [101], ce qui donne Network is unreachable.

Oui le port UDP est bien routé.

@OSAKA
J'ai également trouvé ces infos mais je ne suis pas sur qu elles soient encore d actu, en effet, voici ce que retourne un serveur mutualisé chez OVH sur lequel socket n'est pas autorisé : Operation not permitted

grrrrrrr

J'ai le meme probleme avec fsockopen()...

désespoire

C'est pas étonnant.
Sur les serveur de pages perso, encore plus que sur les serveurs mutualisé, il y a plein de fonctions désactivées pour des raisons de sécurité.
Vous imaginez ce que ça donne si des spammeurs ou des pirates se servent des serveurs de pages perso pour des attaques ?

Sinon, c'est peut être possible sur le cloud d'Amazon ou celui de Google.

Ne peux tu pas héberger la page directement sur l'Arduino ?
Ou bien un Raspberry Pi ? Si tu à la chance d'arriver à en obtenir un avant la fin d'année :slight_smile:

Sinon, on arrive encore à trouver du déstockage sur des netbooks de première génération pour pas très cher. Avec un Ubunto Netbook ca fait un petit serveur pas trop cher, qui ne consomme pas beaucoup.
Moi j'ai récupéré un vieux terminal windows HP T5300, j'ai viré la carte flash d'origine qui tournait un Windows CE que j'ai remplacé par Tinycore, une micro distri Linux. C'est un Transmeta Crusoe (clone Pentium II) à 500 MHz avec 56 MB de SDRAM et j'arrive à faire tourner une mini distri lunix appellée Tinycore pour héberger un micro serveur web, un serveur VPN pour me connecter à mon réseau depuis l'extérieur et 2..3 bricoles.

flyaway:
@OSAKA
J'ai également trouvé ces infos mais je ne suis pas sur qu elles soient encore d actu, en effet, voici ce que retourne un serveur mutualisé chez OVH sur lequel socket n'est pas autorisé : Operation not permitted

La différence entre ovh et free c'est que les socket on été directement désactivé au niveau php côté ovh je pense, je ne suis pas certain ni expert php (j'ai testé les socket en php et je n'ai pas aimé), mais par contre une chose dont je suis presque certain, est qu'il est illusoire de vouloir manipulé des socket chez un hébergeur quel qu’il soit pour des raison de sécurité évidente.
Donc pour toute ses raisons je suis justement en train de me faire une petite application serveur en java dédié aux websocket, ce qui me permettra d’héberger mes fichiers web sur du mutualisé vu que les websocket son initié par le navigateur et sont indépendant de l'hébergeur, il permettra également de manipuler un port série depuis un websocket donc plus besoin de shield ethernet.

osaka:
La grande majorité des hébergeurs mutualisés n'accepte tout simplement pas les socket, même activé niveau php.

Pour free particulièrement, une rapide recherche m'a permis de trouvé ça.

Ouf ça me rassure ... mais c'est vicieux, les fonctions désactivé ne sont pas affiché dans le phpinfo ? J'ai du zaper un truc.

flyaway:
Ma box est en IPV6, ca pose un problème?

Si tu regarde mon code, j affiche deja le code erreur :unable to write to socket [101], ce qui donne Network is unreachable.
Oui le port UDP est bien routé.

Tu ne peut pas envoyer des données depuis une IPV4 vers une IPV6.
Test avec AF_INET6 au lieu AF_INET dans ton socket_create().

flyaway:
J'ai le meme probleme avec fsockopen()...

Si les info d'osaka sont toujours d'actualité (quasi sur) c'est normal que fsocketopen ne marche pas ...
En poussant un peu plus loin vu les restrictions ça pourrait bien être impossible de faire des socket quel qu'ils soient.
En plus il est fort probable que coté serveur tout traffic sortant excepté http et https soit bloqué.

Ok ok, merci à tous pour vos réponse, je vais réfléchire à une autre solution... Ca marchait si bien sur mon wamp (avec le module socket activé :wink: )

Mon sketch, au départ, log des températures dans une base mysql pour mon chauffage. Vous l'aurez deviné je voulais pouvoir changer la consigne de température à distance.

Juste une dernière question sur IPV6 IPV4, je charge a distance des pages sur mon serveur wamp ou dur l'arduino en mode server en appelant une ip public au format IPV4 et kes redirections de port sont faites sous la forme 192.168.0.XX, où est L'ip V6 dans tout ca??
(ma box est bien en IPV6) un éclaircissement peut etre?

Merci encore