Fixer le port source d'une Socket "client en langage C"
Salut a tous,
Je viens vers vous car j'ai un problème avec les sockets. J'ai un serveur en langage C qui écoute sur le port 6250 et un client C qui lui envoie des requêtes et reçoit des réponses (le client utilise un port aléatoire pour sortir). Jusqu'ici, tout va bien. Le problème est que je veux faire tourner le client derrière un proxy qui ne permet pas de sortir sur un port aléatoire. Il autorise la sortie sur le port 80 seulement. J'ai fait une recherche sur Internet, j'ai trouvé que c'est possible avec fpipe qui permet de rediriger le port de sortie mais c'est sous Linux et mon appli tourne sous Windows :(.
Sachant qu'en C++, la classe CAsyncSocket (MFC) possède une méthode Create(port) qui permet de spécifier le port de sortie, cette dernière se base sur l'API Socket. Donc je pense qu'il y a un moyen de le faire mais je ne sais pas comment.
Pour fixer le port client, j'ai utilisé un bind() pour lier la socket au port mais ça ne fonctionne pas. Voici le code :
Code du client:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| struct sockaddr_in addr;
struct sockaddr addC;
SOCKET hSocket;
struct sockaddr addrConnect;
int nPort = 80;
char * pszHost = "91.121.134.221";
hSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
/* Liaison avec le port local (ici 0) */
addr.sin_family = AF_INET ;
addr.sin_addr.s_addr = htonl (INADDR_ANY);
addr.sin_port = htons ((unsigned short)nPort ); // 0 LE Port de sortie du client
if ( bind ( hSocket , (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR ) //C
{
addC.sa_family =AF_INET;
addC = TcpFormatAdress( pszHost, (u_short)6250 );
connect( hSocket, &addC, sizeof(addC));
closesocket ( hSocket ) ;
}
//###############################################
//###############################################
static struct sockaddr TcpFormatAdress( char * host, u_short port )
{
struct sockaddr_in addr;
struct sockaddr addrRet;
struct hostent FAR *lphost ;
u_long IP;
memset((char*)&addr, 0, sizeof(addr));
/* Soit on fournit une adresse IP, soit on fournit un nom */
if ((IP = inet_addr(host)) == (u_long)INADDR_NONE)
{
if ((lphost = gethostbyname(host))==NULL)
{
memset( (char * )&addrRet, 0, sizeof(addrRet) );
return addrRet;
}
addr.sin_family = lphost->h_addrtype;
#ifdef _WIN16 /* A définir dans le projet WIN16 */
_fmemcpy (&addr.sin_addr, lphost->h_addr, lphost->h_length);
#else /* WIN32, UNIX*/
memcpy (&addr.sin_addr, lphost->h_addr, lphost->h_length);
#endif
}
else
{
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = IP;
}
/* Port destination */
addr.sin_port = htons((u_short)port );
memcpy( (char *)&addrRet, (char *)&addr, sizeof(addrRet) );
return addrRet;
}
//###############################################
//############################################### |
Merci d'avance pour toute réponse.