Aller au contenu


Photo
- - - - -

Programmation...............


  • Veuillez vous connecter pour répondre
22 réponses à ce sujet

#1 Speedy

Speedy

    Mega Power Member

  • Membres
  • 277 messages

Posté 27 avril 2001 - 08:12

Salut à tous....

Je programme un expéditeur FTP (stage oblige).

Je connecte mon client sur un port de mon ordi local et j'envoi ou je reçois mes données.

Ceci étant, il m'est impossible de réutiliser 2 fois le même port pour envoyer ou recevoir(faut attendre un moment avant).

Y a t'il quelque chose de spécial à faire.



Merci..........
  • 0

PUBLICITÉ

    Annonces Google

#2 Seiju

Seiju

    Godlike Member

  • Membres
  • 2 059 messages

Posté 27 avril 2001 - 12:23

Oui liberer le port quand la connexion est rompue pour kke raison que ce soit.



Seiju
  • 0

#3 Speedy

Speedy

    Mega Power Member

  • Membres
  • 277 messages

Posté 27 avril 2001 - 12:25

C là tout le pb, comment libérer le port

sachant que je ne peut pas utiliser de fonctions windows toutes faîtes (question de portabilitée)
  • 0

#4 Seiju

Seiju

    Godlike Member

  • Membres
  • 2 059 messages

Posté 27 avril 2001 - 10:01

Heuu ... tu developpes en quoi m'sieur ???

Désolé je connais personne ici qui ait de don de double vue et qui puisse te repondre sans connaitre ton langage de prog.



Seiju
  • 0

#5 Speedy

Speedy

    Mega Power Member

  • Membres
  • 277 messages

Posté 30 avril 2001 - 07:40

Sorry, c vrai.........



Je programme en C++ (Visual C++, a product from Windobe)

[ Ce Message a été édité par: speedy le 2001-04-30 08:41 ]
  • 0

#6 Seiju

Seiju

    Godlike Member

  • Membres
  • 2 059 messages

Posté 30 avril 2001 - 08:19

Si tu veux garder une certaine compatibilité j'imagine que tu n'utilises pas les classes CSocket ou CAsyncSocket qui font parti des MFCs et qui sont donc 100% MicroMou.



J'imagine donc que tu utilises les fonctions definies dans "winsock2.h"



Pour fermer ton socket il faut juste utiliser la fonction : int closesocket(SOCKET);



Par contre, la description de ton probleme est trés floue. J'espere que tu ne spécifies pas le port par lequel le client se connecte au serveur car ce n'est pas l'utilisation normale. Normalement du coté du client, on laisse le systeme te donner un port libre et effectivement c'est a lui de le liberer quand il veut et ca peut prendre un peu de temps.

Mais si tu ne specifies pas le port par lequel le client se connecte, le systeme te fournit toujours un port utilisable.



J'espere que je suis clair dans mon explication . Quand je parle de port par lequel le client se connecte, je ne parles pas du port sur lequel le serveur t'attend (le 21 habituellement).



Seiju

[ Ce Message a été édité par: Seiju le 2001-04-30 09:22 ]
  • 0

#7 Speedy

Speedy

    Mega Power Member

  • Membres
  • 277 messages

Posté 30 avril 2001 - 08:27

J'utilise bien winsock2.h



En effet, c moi qui choisi le port et je le passe au serveur FTP par la commande 'PORT'.

Quelle fonction me permet d'obtenir un numéro de port libre sur le client???

Merci



[ Ce Message a été édité par: speedy le 2001-04-30 09:37 ]
  • 0

#8 Seiju

Seiju

    Godlike Member

  • Membres
  • 2 059 messages

Posté 30 avril 2001 - 08:39

Heuu on est pas au meme niveau, je te parles Socket et tu me parles FTP

Ca n'a rien a voir avec le protocole FTP mais avec la gestion des sockets ton probleme.



A moins que tu n'utilises une lib de fonctions faites par kkun d'autres et que tu ne touches pas toi-même aux sockets. Dans ce cas, il faut voir avec la personne qui a developpé cette lib.



Pour le port libre sur le client, tu n'as rien a faire justement. C'est si tu veux spécifier un port qu'il faut appeler une fonction. Tu te contentes d'appeler la fonction "connect".



En fait tu dois avoir un truc ressemblant a ca :





-----------------------------------------


#include <winsock2.h>





int main(int argc, char* argv[])


{


	SOCKET sockClient;


	struct sockaddr_in addrServ;


	int errCode;


	unsigned int addr;


	struct hostent *hp;


	WORD wVersionRequested;


	WSADATA wsaData;


	int err;





	// Init Winsock


	wVersionRequested = MAKEWORD( WS_VER_HIGH, WS_VER_LOW );


	


	err = WSAStartup( wVersionRequested, &wsaData );


	if ( err != 0 ) {


  /* Tell the user that we could not find a usable */


  /* WinSock DLL.                                  */


  sys_err("Version de Winsock invaliden");


	}


 


	/* Confirm that the WinSock DLL supports 2.2.*/


	/* Note that if the DLL supports versions greater    */


	/* than 2.2 in addition to 2.2, it will still return */


	/* 2.2 in wVersion since that is the version we      */


	/* requested.                                        */


	if ( LOBYTE( wsaData.wVersion ) != WS_VER_LOW ||


      HIBYTE( wsaData.wVersion ) != WS_VER_HIGH ) {


  /* Tell the user that we could not find a usable */


  /* WinSock DLL.                                  */


  WSACleanup( );


  sys_err("Version de Winsock invaliden");


	}





	// Créer socket


	sockClient = socket(AF_INET, SOCK_STREAM, 0);


	if (sockClient == INVALID_SOCKET) {


  sys_err("Erreur création socketn");


	}





	// Position l'adresse et le port du server


	addr = inet_addr("127.0.0.1");


	hp = gethostbyaddr((char *)&addr,4,AF_INET);


	if (hp == NULL) {


  sys_err("Erreur dans l'adresse du servern");


	}





	// Connect socket


	memset(&addrServ, 0, sizeof(addrServ));


	addrServ.sin_family = AF_INET;


	addrServ.sin_port = htons(SERV_PORT);


	memcpy(&(addrServ.sin_addr),hp->h_addr,hp->h_length);


	if (connect(sockClient, (struct sockaddr *)&addrServ, sizeof(addrServ)) != 0) 


	{


  errCode = WSAGetLastError();


  WSACleanup();


  sys_err("Connect error : %dn", errCode);


	}





	// .......


	// ....... Traitement a effectuer pendant la connexion


	// .......





	// Ferme tout


	closesocket(sockClient);





	return 0;


}


---------------------------------------





Seiju



[ Ce Message a été édité par: Seiju le 2001-04-30 09:51 ]
  • 0

#9 Speedy

Speedy

    Mega Power Member

  • Membres
  • 277 messages

Posté 30 avril 2001 - 08:43

Non, je n'utilise rien de fait par qq'un d'autre.

Mais comme je doit créer un client serveur FTP, forcément, je doit utiliser des sockets pour communiquer.

Le problème est que c moi qui choisit le port sur lequel j'envoi (ou récupére) mes données et j'indique au FTP d'utiliser ce port.

En fait le pb est au niveau du socket d'écoute
  • 0

#10 Speedy

Speedy

    Mega Power Member

  • Membres
  • 277 messages

Posté 30 avril 2001 - 08:47

Je ne suis pas trés clai, c vrai (mea culpa)



Le vrai pb est que c moi qui spécifie un numéro de port au départ et si mon socket d'écoute n'est pas accépter, je modifie le numéro de port et je recommence.



Ceci étant, qu"nd j'utilise int closesocket(SOCKET), il semble que mon port ne soit pas libérer, à oins qu'il ne mette un certain temps.

C problème arrive en fait quand j'envoi plusieurs fichiers à la suite.
  • 0