[C][socket][win2k]

Fermé
wAx Messages postés 1590 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 21 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

int connect_socket (char *serverIP, int proto);

WSAEVENT hEvent[MAX_IO_ASYNC];
WSANETWORKEVENTS events;

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));

if (!WSAStartup (wVersionRequested, lpWSAData)) return (0); //ok
else return (-1);
}

void close_sockets (void)
{
if (socket_ouverte==1) closesocket(sock);
free (lpWSAData);
WSACleanup();
}

1 réponse

à mon avis le protocol dns est un sous protocol udp donc il faut pas utiliser SOCK_STREAM mais SOCK_DGRAM qui est adaptée à ce genre de connexion.
0