wAx
Messages postés1590Date d'inscriptionlundi 26 mai 2003StatutMembreDernière intervention21 novembre 2011
-
4 juin 2003 à 15:12
corba -
4 juin 2003 à 17:45
Bonjour,
J'ai un logiciel qui se connecte en TCP sur differents serveurs.
Seulement, j'ai besoin qu'il soit aussi capable de se connecter en UDP. J'ai modifié le code source TCP avec un switch afin que selon le protocole il bascule en TCP ou UDP. Seulement, j'obtiens une erreur à l'initialisation des sockets. Voici un extrait du source. Par avance, merci de votre aide.
L'erreur intervient sur la seconde ligne apres le while, je retrouve un socket error lorsque le protocole est DNS (le seul UDP ici)
Code:
#define HTTP -24
#define FTP -25
#define MAIL -26
#define DNS -27
void main(argc, argv)
int argc;
char * argv[];
{
(...)
//initialisation des sockets
if (init_sockets()<0) {if (DEBUG) printf("Erreur Init_Socket, erreur = %d", WSAGetLastError()); } // Init Winsocks
if ((ret=connect_socket(dns,proto))<0) {gestion_erreur_code (ret);}
printf("connect OK\n");
while(1) {
WSAWaitForMultipleEvents(MAX_IO_ASYNC, hEvent, FALSE, 3000, FALSE);
if (WSAEnumNetworkEvents(sock, hEvent[0], &events) == SOCKET_ERROR) { gestion_erreur_code(ERREUR_CB_EVENT);}
if (events.lNetworkEvents & FD_CONNECT) break;
else if (events.lNetworkEvents & FD_READ) gestion_erreur_code (ERREUR_READ);
else if (events.lNetworkEvents & FD_CLOSE) gestion_erreur_code (ERREUR_CLOSE);
else {
if (DEBUG) printf("code event1 : %d\n", events.lNetworkEvents);
gestion_erreur_code (ERREUR_EVENT_SELECT1+events.lNetworkEvents);
}
}
(..)
}
int connect_socket (char *serverIP, int proto)
{ struct sockaddr_in sockin;
int OK=0, socket_timeout=SOCKET_TIMEOUT;
struct hostent *hostinfos;
u_short serverPort;
switch(proto) {
case HTTP: serverPort=80; break;
case MAIL: serverPort=25; break;
case DNS : serverPort=53; break;
default : return (ERREUR_SOCKET);
}
WSASetLastError (0);
if ((hostinfos=gethostbyname (serverIP)) == NULL) return (ERREUR_DNS);
memset (&sockin, 0, sizeof (sockin));
sockin.sin_family = AF_INET;
sockin.sin_port = htons(serverPort);
sockin.sin_addr = *((LPIN_ADDR)*hostinfos->h_addr_list);
//creation de la socket TCP/IP et evenement associé
switch(proto) {
case HTTP : if ((sock = socket (AF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0) return (ERREUR_SOCKET); break;
case MAIL : if ((sock = socket (AF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0) return (ERREUR_SOCKET); break;
case DNS : if ((sock = socket (AF_INET,SOCK_STREAM,IPPROTO_UDP)) < 0) return (ERREUR_SOCKET); break;
case FTP : if ((sock = socket (AF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0) return (ERREUR_SOCKET); break;
default : return (ERREUR_SOCKET);
}
socket_ouverte = 1;
if ((hEvent[0] = WSACreateEvent()) == WSA_INVALID_EVENT) return (ERREUR_EVENT);
if ((WSAEventSelect(sock, hEvent[0], FD_READ|FD_CONNECT|FD_CLOSE)) == SOCKET_ERROR) return (ERREUR_EVENT_SELECT);
if (connect(sock,(LPSOCKADDR)&sockin, sizeof(SOCKADDR_IN))==SOCKET_ERROR) if (WSAGetLastError()!= WSAEWOULDBLOCK) return (ERREUR_CONNECT);
if (DEBUG) printf("------>\tConnect socket\n");
return (1);
}
LPWSADATA lpWSAData;
int init_sockets (void)
{
// Initialisation des Sockets Windows
WORD wVersionRequested=MAKEWORD(1,1);
lpWSAData=(LPWSADATA)malloc (sizeof (WSADATA));