Accueil > > > TÉLÉCHARGER UN FICHIER (WIN32, SOCKETS)
TÉLÉCHARGER UN FICHIER (WIN32, SOCKETS)
Information sur la source
Description
Voici un petit programme qui se connecte à un serveur http et qui télécharge un fichier (a partir d'une URL). Une progressbar donne une idée de la progression du téléchargement. La vitesse de téléchargement est affichée, ainsi que le temp restant (théorique). Lorsque l'on entre une URL et que l'on apuis sur Entrer, le programme lance un thread qui se charge du téléchargement. Le modele d'utilisation de winsock choisi est WSAEventSelect(...). Le fichier téléchargé est copié dans 'mes documents'.
Source
- #include <stdio.h>
- #include <winsock2.h>
- #include <windows.h>
- #include <commctrl.h>
- #include "resource.h"
- #pragma comment(lib, "ws2_32.lib")
- #pragma comment(lib, "comctl32.lib")
-
- #define BUF_SIZE 8192 // 8KO
- #define M(szTXT) SetWindowText(g_hSTA, szTXT)
-
- HWND g_hSTA, g_hBAR, g_hSpeed, g_hDlg;
- BOOL g_bDownloading = false;
-
- BOOL CALLBACK AppDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
- DWORD WINAPI DownloadProc(void * szURL);
- DWORD GetServerAddress(char * szURL);
- int ParseHeaderHttp(char * buffer, int buffersize, int * sizeoffile);
- char * GetFileNameFromURL(char * szURL);
- int GetDocumentsDirectory(char * szbuf, int bufsize);
-
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
- {
- WSADATA wsa;
- if(WSAStartup(0x0202, &wsa)) return 0;
- DialogBoxParam(hInstance, "MainDialog", 0, AppDlgProc, 0);
- WSACleanup();
- return 0;
- }
-
- BOOL CALLBACK AppDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- static HANDLE hThread = 0;
- static HWND hURL;
- static char szURL[256];
- switch(uMsg)
- {
- case WM_INITDIALOG:
- InitCommonControls();
- SetClassLong(hDlg, GCL_HICON,(long) "icone");
- g_hDlg = hDlg;
- hURL = GetDlgItem(hDlg, IDC_URL);
- g_hBAR = GetDlgItem(hDlg, IDC_BAR);
- g_hSpeed = GetDlgItem(hDlg, IDC_SPEED);
- g_hSTA = GetDlgItem(hDlg, IDC_STA);
- SetWindowText(g_hDlg, "Téléchargement");
- return 1;
- case WM_COMMAND:
- switch(LOWORD(wParam))
- {
- case IDOK:
- if(!g_bDownloading)
- {
- g_bDownloading = true;
- GetWindowText(hURL, szURL, 256);
- SendMessage(g_hBAR, PBM_SETPOS, 0, 0);
- if(hThread) CloseHandle(hThread);
- hThread = CreateThread(0, 0, DownloadProc, szURL, 0, 0);
- }
- return 0;
- case IDCANCEL:
- if(g_bDownloading)
- {
- if(IDNO == MessageBox(hDlg, "Fichier actuellement en cours de téléchargement.\r\nEtes vous sur de vouloir quitter ?", "Téléchargement en cours", MB_YESNO|MB_ICONWARNING))
- return 0;
- }
- CloseHandle(hThread);
- EndDialog(hDlg, 0);
- }
- }
- return 0;
- }
-
- DWORD WINAPI DownloadProc(void * szURL)
- {
- SOCKET s;
- sockaddr_in sin;
- WSAEVENT hEvent[1];
- WSANETWORKEVENTS NetworkEvent;
- HANDLE hFile;
- BYTE buffer[BUF_SIZE], *pBuffer;
- DWORD dwSize = 0, dwRecu = 0, dwEcrit = 0, dwEcritTotal = 0;
- DWORD dwLastEcritTotal = 0, dwDebit = 0, dwLastTickCount = 0;
- DWORD dwTickCountDebut = 0, dwTempRestant = 0, dwDebitMoyen = 0;
- char szTEMP[256], szLOCAL[256], *szFileName;
- bool bHttpHeader = false;
-
- // I: initialisation de la connexion
- s = socket(AF_INET, SOCK_STREAM, 0);
- if(s == -1) {
- M("Erreur création socket.");
- goto err_socket;}
-
- sin.sin_family = AF_INET;
- sin.sin_port = htons(80);
- sin.sin_addr.S_un.S_addr = GetServerAddress((char*)szURL);
-
- hEvent[0] = WSACreateEvent();
- WSAEventSelect(s, hEvent[0], FD_READ | FD_CONNECT | FD_CLOSE);
-
- connect(s, (sockaddr*)&sin, sizeof(sin));
- M("Connexion au serveur...");
-
- // II: initialisation du fichier local
- if(!GetDocumentsDirectory(szTEMP, 256)) strcpy(szTEMP, "c:\\");
- strcpy(szLOCAL, szTEMP);
- szFileName = GetFileNameFromURL((char*) szURL);
- strcat(szLOCAL, szFileName);
- hFile = CreateFile(szLOCAL, FILE_ALL_ACCESS, FILE_SHARE_WRITE, 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
- if(hFile == INVALID_HANDLE_VALUE)
- {
- M("Erreur fichier.");
- goto err_socket;
- }
-
- // III: connexion, déconnexion, reception du fichier
- while(1)
- {
- memset(&NetworkEvent, 0, sizeof(NetworkEvent));
-
- WSAWaitForMultipleEvents(1, hEvent, 0, WSA_INFINITE, 0);
- WSAEnumNetworkEvents(s, hEvent[0], &NetworkEvent);
-
- if(NetworkEvent.lNetworkEvents & FD_CONNECT)
- {
- // erreur a la connexion
- if(NetworkEvent.iErrorCode[FD_CONNECT_BIT]) {
- M("Erreur lors de la connexion.");
- CloseHandle(hFile); DeleteFile(szLOCAL);
- goto err_socket;}
-
- // si connexion ok, envoi de la requette
- strcpy(szTEMP, "GET ");
- strcat(szTEMP,(const char*) szURL);
- strcat(szTEMP, " HTTP/1.0\r\n\r\n");
- send(s, szTEMP, strlen(szTEMP), 0);
- M("Envoi de la requette http au serveur...");
- }
-
- if(NetworkEvent.lNetworkEvents & FD_READ)
- {
- dwRecu = 0;
- pBuffer = buffer;
- dwRecu = recv(s,(char*) buffer, BUF_SIZE, 0);
-
- //traitement du header
- if(!bHttpHeader)
- {
- int iHeaderLen;
- dwLastTickCount = dwTickCountDebut = GetTickCount(); // debut du download
- iHeaderLen = ParseHeaderHttp((char*)buffer, BUF_SIZE,(int*) &dwSize);
- if(!iHeaderLen)
- {
- M("Fichier introuvable.");
- CloseHandle(hFile); DeleteFile(szLOCAL);
- goto err_socket;
- }
- pBuffer += iHeaderLen;
- dwRecu -= iHeaderLen;
- bHttpHeader = true;
- M("Header HTTP recu.");
- }
-
- // ecriture dans le fichier
- WriteFile(hFile, pBuffer, dwRecu, &dwEcrit, 0);
- dwEcritTotal += dwEcrit;
-
- // affichage progressbar, infos, vitesse & temp restant
- SendMessage(g_hBAR, PBM_SETPOS, (int)(100 * ((double)dwEcritTotal/(double)dwSize)), 0);
-
- sprintf(szTEMP, "%s: %d/%d", szFileName, dwEcritTotal, dwSize);
- M(szTEMP);
-
- if(dwLastTickCount+1000 < GetTickCount())
- {
- // vitesse download
- dwDebit = (dwEcritTotal - dwLastEcritTotal) / 1024;
- dwLastTickCount = GetTickCount();
- dwLastEcritTotal = dwEcritTotal;
- sprintf(szTEMP, "%d ko/s", dwDebit);
- SetWindowText(g_hSpeed, szTEMP);
-
- // temp restant
- dwDebitMoyen = dwEcritTotal / (GetTickCount()-dwTickCountDebut+1);
- dwTempRestant = (dwSize-dwEcritTotal) / (dwDebitMoyen * 1000 + 1);
- sprintf(szTEMP, "Téléchargement [%d %s]",
- (dwTempRestant >= 60) ? dwTempRestant/60 : dwTempRestant,
- (dwTempRestant >= 60) ? "min" : "sec");
- SetWindowText(g_hDlg, szTEMP);
- }
-
- // téléchargement fini
- if(dwSize == dwEcritTotal)
- {
- M("Téléchargement terminé.");
- goto err_file;
- }
- }
-
- if(NetworkEvent.lNetworkEvents & FD_CLOSE)
- {
- // verifie s'il ne reste plus rien a lire sur le socket
- do {
- memset(&NetworkEvent, 0, sizeof(NetworkEvent));
- WSAEnumNetworkEvents(s, 0, &NetworkEvent);
- if(NetworkEvent.lNetworkEvents & FD_READ)
- {
- dwRecu = 0;
- dwRecu = recv(s,(char*) buffer, BUF_SIZE, 0);
- WriteFile(hFile, buffer, dwRecu, &dwEcrit, 0);
- dwEcritTotal += dwEcrit;
- if(dwSize == dwEcritTotal) break;
- }
- }while(NetworkEvent.lNetworkEvents & FD_READ);
-
- if(dwSize == dwEcritTotal) M("Téléchargement terminé.");
- else M("Déconnecté du serveur.");
- goto err_file;
- }
- }
-
- err_file:
- CloseHandle(hFile);
- err_socket:
- closesocket(s);
- WSACloseEvent(hEvent[0]);
- SendMessage(g_hBAR, PBM_SETPOS, 0, 0);
- SetWindowText(g_hSpeed, 0);
- g_bDownloading = false;
- return 0;
- }
-
- // retourne un DWORD directement copiable dans sin_addr.S_un.S_addr (ip du serveur)
- // szURL doit etre dans un buffer
- DWORD GetServerAddress(char * szURL)
- {
- hostent * serv;
- char * z; // z mettra le zero final
- char * d = szURL; // d pointera sur le debut du nom du serveur
- if(*d=='h' && *(d+1)=='t' && *(d+2)=='t' && *(d+3)=='p') d += 7; // 7 = http://
- z = d;
- while(*z != '/' && *z) z++; *z = 0;
- serv = gethostbyname(d);
- *z = '/';
- if(!serv) return 0;
- return (DWORD)*((DWORD*)serv->h_addr_list[0]);
- }
-
- // parse la 1ere réponse du serveur http apres une requette download de fichier
- // extrait la taille du fichier, retourne la taille du header ou 0 si erreur
- int ParseHeaderHttp(char * buffer, int buffersize, int * sizeoffile)
- {
- char * c, * f;
- bool reponse_ok = false;
- c = buffer;
- f = c + buffersize; // c ne dois jamais depasser f
-
- while(c < f)
- {
- // on verifie que le serveur réponds bien 200
- if(*c=='2' && *(c+1)=='0' && *(c+2)=='0' && *(c+3)==32) reponse_ok = true;
-
- // taille du fichier dans ligne de forme: "Content-Length: 123456"
- if(*c =='\n') {
- if(!strncmp(c+1,"Content-Length:", 15)) {
- c += 17;
- *sizeoffile = atoi(c);}}
-
- // ligne vide = fin header http = debut fichier
- if(*c=='\r' && *(c+1)=='\n' && *(c+2)=='\r' && *(c+3)=='\n' && reponse_ok == true && *sizeoffile) {
- c += 4;
- return (int)(c - buffer);}
- c++;
- }
- return 0;
- }
-
- // retourne un pointeur sur le nom du fichier dans une URL
- char * GetFileNameFromURL(char * szURL)
- {
- char * c = szURL;
- while(*c) c++;
- while(c > szURL && *c != '/') c--;
- return (char*)++c;
- }
-
- // trouve le chemin de Mes Documents, rajoute le '\' final
- int GetDocumentsDirectory(char *szbuf, int bufsize)
- {
- HKEY hKey;
- int size, l;
- char *c;
- if(RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", 0, KEY_QUERY_VALUE, &hKey))
- return 0;
- size = bufsize;
- l = RegQueryValueEx(hKey, "Personal", 0, 0, (BYTE*) szbuf, (DWORD*) &size);
- RegCloseKey(hKey);
- if(l) return 0;
- c = szbuf + size - 1;
- if(*(c-1) != '\\') {*c++ = '\\'; *c = 0;}
- return (c - szbuf);
- }
-
-
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
#include <commctrl.h>
#include "resource.h"
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "comctl32.lib")
#define BUF_SIZE 8192 // 8KO
#define M(szTXT) SetWindowText(g_hSTA, szTXT)
HWND g_hSTA, g_hBAR, g_hSpeed, g_hDlg;
BOOL g_bDownloading = false;
BOOL CALLBACK AppDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
DWORD WINAPI DownloadProc(void * szURL);
DWORD GetServerAddress(char * szURL);
int ParseHeaderHttp(char * buffer, int buffersize, int * sizeoffile);
char * GetFileNameFromURL(char * szURL);
int GetDocumentsDirectory(char * szbuf, int bufsize);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
WSADATA wsa;
if(WSAStartup(0x0202, &wsa)) return 0;
DialogBoxParam(hInstance, "MainDialog", 0, AppDlgProc, 0);
WSACleanup();
return 0;
}
BOOL CALLBACK AppDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static HANDLE hThread = 0;
static HWND hURL;
static char szURL[256];
switch(uMsg)
{
case WM_INITDIALOG:
InitCommonControls();
SetClassLong(hDlg, GCL_HICON,(long) "icone");
g_hDlg = hDlg;
hURL = GetDlgItem(hDlg, IDC_URL);
g_hBAR = GetDlgItem(hDlg, IDC_BAR);
g_hSpeed = GetDlgItem(hDlg, IDC_SPEED);
g_hSTA = GetDlgItem(hDlg, IDC_STA);
SetWindowText(g_hDlg, "Téléchargement");
return 1;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
if(!g_bDownloading)
{
g_bDownloading = true;
GetWindowText(hURL, szURL, 256);
SendMessage(g_hBAR, PBM_SETPOS, 0, 0);
if(hThread) CloseHandle(hThread);
hThread = CreateThread(0, 0, DownloadProc, szURL, 0, 0);
}
return 0;
case IDCANCEL:
if(g_bDownloading)
{
if(IDNO == MessageBox(hDlg, "Fichier actuellement en cours de téléchargement.\r\nEtes vous sur de vouloir quitter ?", "Téléchargement en cours", MB_YESNO|MB_ICONWARNING))
return 0;
}
CloseHandle(hThread);
EndDialog(hDlg, 0);
}
}
return 0;
}
DWORD WINAPI DownloadProc(void * szURL)
{
SOCKET s;
sockaddr_in sin;
WSAEVENT hEvent[1];
WSANETWORKEVENTS NetworkEvent;
HANDLE hFile;
BYTE buffer[BUF_SIZE], *pBuffer;
DWORD dwSize = 0, dwRecu = 0, dwEcrit = 0, dwEcritTotal = 0;
DWORD dwLastEcritTotal = 0, dwDebit = 0, dwLastTickCount = 0;
DWORD dwTickCountDebut = 0, dwTempRestant = 0, dwDebitMoyen = 0;
char szTEMP[256], szLOCAL[256], *szFileName;
bool bHttpHeader = false;
// I: initialisation de la connexion
s = socket(AF_INET, SOCK_STREAM, 0);
if(s == -1) {
M("Erreur création socket.");
goto err_socket;}
sin.sin_family = AF_INET;
sin.sin_port = htons(80);
sin.sin_addr.S_un.S_addr = GetServerAddress((char*)szURL);
hEvent[0] = WSACreateEvent();
WSAEventSelect(s, hEvent[0], FD_READ | FD_CONNECT | FD_CLOSE);
connect(s, (sockaddr*)&sin, sizeof(sin));
M("Connexion au serveur...");
// II: initialisation du fichier local
if(!GetDocumentsDirectory(szTEMP, 256)) strcpy(szTEMP, "c:\\");
strcpy(szLOCAL, szTEMP);
szFileName = GetFileNameFromURL((char*) szURL);
strcat(szLOCAL, szFileName);
hFile = CreateFile(szLOCAL, FILE_ALL_ACCESS, FILE_SHARE_WRITE, 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
if(hFile == INVALID_HANDLE_VALUE)
{
M("Erreur fichier.");
goto err_socket;
}
// III: connexion, déconnexion, reception du fichier
while(1)
{
memset(&NetworkEvent, 0, sizeof(NetworkEvent));
WSAWaitForMultipleEvents(1, hEvent, 0, WSA_INFINITE, 0);
WSAEnumNetworkEvents(s, hEvent[0], &NetworkEvent);
if(NetworkEvent.lNetworkEvents & FD_CONNECT)
{
// erreur a la connexion
if(NetworkEvent.iErrorCode[FD_CONNECT_BIT]) {
M("Erreur lors de la connexion.");
CloseHandle(hFile); DeleteFile(szLOCAL);
goto err_socket;}
// si connexion ok, envoi de la requette
strcpy(szTEMP, "GET ");
strcat(szTEMP,(const char*) szURL);
strcat(szTEMP, " HTTP/1.0\r\n\r\n");
send(s, szTEMP, strlen(szTEMP), 0);
M("Envoi de la requette http au serveur...");
}
if(NetworkEvent.lNetworkEvents & FD_READ)
{
dwRecu = 0;
pBuffer = buffer;
dwRecu = recv(s,(char*) buffer, BUF_SIZE, 0);
//traitement du header
if(!bHttpHeader)
{
int iHeaderLen;
dwLastTickCount = dwTickCountDebut = GetTickCount(); // debut du download
iHeaderLen = ParseHeaderHttp((char*)buffer, BUF_SIZE,(int*) &dwSize);
if(!iHeaderLen)
{
M("Fichier introuvable.");
CloseHandle(hFile); DeleteFile(szLOCAL);
goto err_socket;
}
pBuffer += iHeaderLen;
dwRecu -= iHeaderLen;
bHttpHeader = true;
M("Header HTTP recu.");
}
// ecriture dans le fichier
WriteFile(hFile, pBuffer, dwRecu, &dwEcrit, 0);
dwEcritTotal += dwEcrit;
// affichage progressbar, infos, vitesse & temp restant
SendMessage(g_hBAR, PBM_SETPOS, (int)(100 * ((double)dwEcritTotal/(double)dwSize)), 0);
sprintf(szTEMP, "%s: %d/%d", szFileName, dwEcritTotal, dwSize);
M(szTEMP);
if(dwLastTickCount+1000 < GetTickCount())
{
// vitesse download
dwDebit = (dwEcritTotal - dwLastEcritTotal) / 1024;
dwLastTickCount = GetTickCount();
dwLastEcritTotal = dwEcritTotal;
sprintf(szTEMP, "%d ko/s", dwDebit);
SetWindowText(g_hSpeed, szTEMP);
// temp restant
dwDebitMoyen = dwEcritTotal / (GetTickCount()-dwTickCountDebut+1);
dwTempRestant = (dwSize-dwEcritTotal) / (dwDebitMoyen * 1000 + 1);
sprintf(szTEMP, "Téléchargement [%d %s]",
(dwTempRestant >= 60) ? dwTempRestant/60 : dwTempRestant,
(dwTempRestant >= 60) ? "min" : "sec");
SetWindowText(g_hDlg, szTEMP);
}
// téléchargement fini
if(dwSize == dwEcritTotal)
{
M("Téléchargement terminé.");
goto err_file;
}
}
if(NetworkEvent.lNetworkEvents & FD_CLOSE)
{
// verifie s'il ne reste plus rien a lire sur le socket
do {
memset(&NetworkEvent, 0, sizeof(NetworkEvent));
WSAEnumNetworkEvents(s, 0, &NetworkEvent);
if(NetworkEvent.lNetworkEvents & FD_READ)
{
dwRecu = 0;
dwRecu = recv(s,(char*) buffer, BUF_SIZE, 0);
WriteFile(hFile, buffer, dwRecu, &dwEcrit, 0);
dwEcritTotal += dwEcrit;
if(dwSize == dwEcritTotal) break;
}
}while(NetworkEvent.lNetworkEvents & FD_READ);
if(dwSize == dwEcritTotal) M("Téléchargement terminé.");
else M("Déconnecté du serveur.");
goto err_file;
}
}
err_file:
CloseHandle(hFile);
err_socket:
closesocket(s);
WSACloseEvent(hEvent[0]);
SendMessage(g_hBAR, PBM_SETPOS, 0, 0);
SetWindowText(g_hSpeed, 0);
g_bDownloading = false;
return 0;
}
// retourne un DWORD directement copiable dans sin_addr.S_un.S_addr (ip du serveur)
// szURL doit etre dans un buffer
DWORD GetServerAddress(char * szURL)
{
hostent * serv;
char * z; // z mettra le zero final
char * d = szURL; // d pointera sur le debut du nom du serveur
if(*d=='h' && *(d+1)=='t' && *(d+2)=='t' && *(d+3)=='p') d += 7; // 7 = http://
z = d;
while(*z != '/' && *z) z++; *z = 0;
serv = gethostbyname(d);
*z = '/';
if(!serv) return 0;
return (DWORD)*((DWORD*)serv->h_addr_list[0]);
}
// parse la 1ere réponse du serveur http apres une requette download de fichier
// extrait la taille du fichier, retourne la taille du header ou 0 si erreur
int ParseHeaderHttp(char * buffer, int buffersize, int * sizeoffile)
{
char * c, * f;
bool reponse_ok = false;
c = buffer;
f = c + buffersize; // c ne dois jamais depasser f
while(c < f)
{
// on verifie que le serveur réponds bien 200
if(*c=='2' && *(c+1)=='0' && *(c+2)=='0' && *(c+3)==32) reponse_ok = true;
// taille du fichier dans ligne de forme: "Content-Length: 123456"
if(*c =='\n') {
if(!strncmp(c+1,"Content-Length:", 15)) {
c += 17;
*sizeoffile = atoi(c);}}
// ligne vide = fin header http = debut fichier
if(*c=='\r' && *(c+1)=='\n' && *(c+2)=='\r' && *(c+3)=='\n' && reponse_ok == true && *sizeoffile) {
c += 4;
return (int)(c - buffer);}
c++;
}
return 0;
}
// retourne un pointeur sur le nom du fichier dans une URL
char * GetFileNameFromURL(char * szURL)
{
char * c = szURL;
while(*c) c++;
while(c > szURL && *c != '/') c--;
return (char*)++c;
}
// trouve le chemin de Mes Documents, rajoute le '\' final
int GetDocumentsDirectory(char *szbuf, int bufsize)
{
HKEY hKey;
int size, l;
char *c;
if(RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", 0, KEY_QUERY_VALUE, &hKey))
return 0;
size = bufsize;
l = RegQueryValueEx(hKey, "Personal", 0, 0, (BYTE*) szbuf, (DWORD*) &size);
RegCloseKey(hKey);
if(l) return 0;
c = szbuf + size - 1;
if(*(c-1) != '\\') {*c++ = '\\'; *c = 0;}
return (c - szbuf);
}
Historique
- 19 juillet 2004 02:37:34 :
- petite modification de la syntaxe de la requette http qui n'etait pas "valide" selon la RFC HTTP/1.0.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLETECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLE par ROMELARD Fabrice
Speakers: Julien Marechal, Gautier Confiant, Sébastien MEYER La session débute par le positionnement de la solution System Center par rapport aux concepts d'organisation ITIL. Le portail du catalogue de se...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : PLEINIèRE SECOND JOURTECHDAYS PARIS 2012 : PLEINIèRE SECOND JOUR par ROMELARD Fabrice
Après une première journée dédiée aux développeurs, cette seconde journée est dédiée au monde des entreprises et de ses applications. Ainsi, cette pleinière est dédiée à faire un 360 de l'évolution des applications Business aux demandes ac...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : RETOUR D'EXPéRIENCE SUR LA MISE EN PLACE D'UN CLOUD PRIVéTECHDAYS PARIS 2012 : RETOUR D'EXPéRIENCE SUR LA MISE EN PLACE D'UN CLOUD PRIVé par ROMELARD Fabrice
Speaker : Guillaume Rochette Cette session est dédiée à fournir le retour sur la mise en place d'un cloud privé (IaaS) par Osiatis pour son compte ou celui de ses clients. Ce projet s'est déroulé sur 4 mois et a permis de faire évoluer...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : COMMENT SHAREPOINT A SAUVé MES TECHDAYSTECHDAYS PARIS 2012 : COMMENT SHAREPOINT A SAUVé MES TECHDAYS par ROMELARD Fabrice
Speakers : Lionel Limozin et Alain Marty La session commence par une découverte de SharePoint à travers la mise en place d'un environnement SharePoint pour la gestion des Sessions animées par BeWise. Le besoin est très ba...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
AUMLAUML par sassion
Cliquez pour lire la suite par sassion
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|