Page 1 sur 1

socket_create probleme de port source

Posté : 01 avr. 2010, 15:55
par manu.07
Bonjour a tous

J'aimerai savoir si il est possible de mettre un port source
sur des packet udp créer avec socket_create.
 
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
 
$msg = "Message de moi";
$len = strlen($msg);
$ipadd = '192.168.0.1';
$port = '10000';
 
socket_sendto($sock, $msg, $len, 0, $ipadd, $port);
socket_close($sock);
Avec ce code j'ai bien le port 10000 destination mais pas en port source.

Merci de votre aide

Manu.07

Re: socket_create probleme de port source

Posté : 01 avr. 2010, 15:58
par Calimero
Bonjour,

Non, c'est ton système qui choisit le port source pour toi.

Re: socket_create probleme de port source

Posté : 01 avr. 2010, 16:08
par manu.07
merci de ta réponse rapide et très claire
Mais il est bien dommage que cela ne soit pas possible :(

Mon autre probleme est que j'ai un checksum erreur avec ma trame comment
faire pour calculer le bon checksum ?

Re: socket_create probleme de port source

Posté : 01 avr. 2010, 16:36
par Calimero
merci de ta réponse rapide et très claire
Mais il est bien dommage que cela ne soit pas possible :(
En utilisation normale tu n'en as pas besoin. J'en déduis que ce que tu cherches à faire n'est pas très normal ^^
Mon autre probleme est que j'ai un checksum erreur avec ma trame comment
faire pour calculer le bon checksum ?
En te connectant de cette manière tu n'as pas besoin de t'occuper du checksum, c'est aussi le système qui le gère pour toi ;)
En UDP tu as seulement à te préoccuper du contenu des paquets que tu veux envoyer. Le mode de calcul du checksum n'est pas simple à expliquer (et encore moins à implémenter) mais peut être trouvé facilement sur le web. Mais pour te répondre plus précisément sur l'erreur que tu rencontres il faudrait du code et/ou + d'infos, sur le contexte notamment...

Re: socket_create probleme de port source

Posté : 01 avr. 2010, 16:56
par manu.07
Mon bute est de recevoir des trames en udp sur le port 10000 d'un soft avec un tag SENDTO et de
l'envoyer vers une autre adresse avec le tag RECTO tjs avec le port 10000 et en UDP.



Lorsque je revoi ma trame avec le tag RECTO vers mon soft il me marque une erreur checksum UDP.


Voila pour les explications

Re: socket_create probleme de port source

Posté : 01 avr. 2010, 17:13
par Calimero
Ok, du proxying UDP donc, je vois mieux.

Regarde à tout hasard du côté des flags, peut-être que le bête 0 n'est pas adapté à ton cas : http://fr.php.net/socket_sendto

Et surtout garde ça sous la main, c'est le document de référence pour l'UDP. Un peu indigeste mais tu vas sûrement en avoir besoin : http://tools.ietf.org/html/rfc768

Re: socket_create probleme de port source

Posté : 07 avr. 2010, 07:38
par manu.07
Bonjour et merci pour les liens

Pour le moment j'ai toujours le meme probleme lors de la reception du packet dans le soft, j'ai un checksum erreur alors que dans wireshark
il est bon.

J'ai trouvé un autre code pour envoyer des packet mais j'ai le meme résultat.
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
$sock_data = socket_connect($sock, $ipadd, $port);
$sock_data = socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 1); 
$sock_data = socket_write($sock, $msg); //Send data
socket_close($sock); //Close socket

En suivant les liens ci dessus je lu qu'avec
stream_socket_server()
il y aurrait la possibilitée de fixer le port source mais je n'y suis pas arrivé.

A suivre ...

Si vous avez une idée je suis preneur.

Re: socket_create probleme de port source

Posté : 20 avr. 2010, 20:02
par SpeedHunter
un exemple:

Code : Tout sélectionner

information_sur_la_destination.sin_family=AF_INET; // Indiquez l'utilisation d'IPV4 information_sur_la_destination.sin_addr.s_addr=inet_addr("10.10.10.10"); // Indiquez l'adresse IP de votre serveur information_sur_la_destination.sin_port=htons(33333); // Port TCP 33333 à destination du serveur strcpy(buffer,"Coucou, je suis les donnees. www.frameip.com"); // Copie la chaine de caractère dans buffer nombre_de_caractere=sendto(id_de_la_socket,buffer,strlen(buffer),0,(struct sockaddr*)&information_sur_la_destination,sizeof(information_sur_la_destination)); if (nombre_de_caractere==SOCKET_ERROR) printf("\nDesole, je ne peux pas envoyer les donnees du a l'erreur : %d",WSAGetLastError()); else printf("\nsend : OK");
il y a pleins d'exemples sur la toile....ce n'est pas complique ne t'en fais pas.

Si tu as le logiciel Borland il y a un fichier winsock2.hlp qui pourrait t'aider...