[C][socket][win2k]
wAx
Messages postés
1596
Date d'inscription
Statut
Membre
Dernière intervention
-
corba -
corba -
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:
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();
}
A voir également:
- [C][socket][win2k]
- Error 2002 (hy000): can't connect to local server through socket '/run/mysqld/mysqld.sock' (2) - Forum Bases de données
- Socket 1366 ✓ - Forum Matériel & Système
- Changer socket carte mere ✓ - Forum Processeur
- Socket 1150 vs 1151 - Forum Processeur
- Socket error soulseek - Forum Logiciels