IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Creer une application client server en WinApi


Sujet :

Réseau C

  1. #1
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut Creer une application client server en WinApi
    Bonjour, j'ai créé un squelette d'une application client/server, en suivant un tutoriel, ainsi je sais envoyer un nessage du client au server, mais pour le retour (de server à client), je ne sais pas comment m'y prendre.

    Voici mon code server:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    
    // baseserver.cpp: dfinit le point d'entre pour l'application.
    //
    #include"stdafx.h"
    #include<winsock2.h>
    #pragmacomment(lib, "ws2_32.lib")
    #include"baseserver.h"
    #include<windows.h>
    #include<stdio.h>
    #include"..\definitions.h"
    #define MAX_LOADSTRING 100
    #define SOCKET_ERRNO WSAGetLastError()
    #define nPort 1812
    // Variables globales:
    HINSTANCE hInst; // instance actuelle
    TCHAR szTitle[MAX_LOADSTRING]; // Le texte de la barre de titre
    TCHAR szWindowClass[MAX_LOADSTRING]; // le nom de la classe de fentre principale
    HWND fenetre;
    // Pr-dclarations des fonctions incluses dans ce module de code:
    ATOM MyRegisterClass(HINSTANCE hInstance);
    BOOL InitInstance(HINSTANCE, int);
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
    void recevoir();
    void afficher_log(char* quoi);
    SOCKET hSocket; 
    struct sockaddr_in addr;
    WSADATA stack_info;
    bool start=false;
     
    int APIENTRY _tWinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPTSTR lpCmdLine,
    int nCmdShow)
    {
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);
    // TODO: placez ici le code.
    WSAStartup(MAKEWORD(2,0), &stack_info );
    hSocket = socket( PF_INET, SOCK_DGRAM, 0 );
    if( hSocket == INVALID_SOCKET )
    {
    MessageBox(NULL, "socket() error "+ SOCKET_ERRNO,"",MB_ICONERROR );
    return -1;
    }
    addr.sin_family = AF_INET ;
    addr.sin_addr.s_addr = htonl (INADDR_ANY);
    addr.sin_port = htons ((unsignedshort)nPort );
    if ( bind( hSocket, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR )
    {
    MessageBox(NULL, "bind() error "+ SOCKET_ERRNO,"",MB_ICONERROR );
    return -1;
    }
    // fin de TODO
    MSG msg;
    HACCEL hAccelTable;
    // Initialise les chanes globales
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_BASESERVER, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);
    // Effectue l'initialisation de l'application:
    if (!InitInstance (hInstance, nCmdShow))
    {
    return FALSE;
    }
    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_BASESERVER));
    SetTimer(fenetre,0,50,NULL);
    // Boucle de messages principale:
    while( TRUE)
    {
    if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE))
    {
    if( GetMessage( &msg, NULL, 0, 0 ) == 0)
    return 0; // Message ist WM_QUIT
    if( TranslateAccelerator( msg.hwnd, hAccelTable, &msg) == 0)
    {
    TranslateMessage( &msg); 
    DispatchMessage( &msg);
    }
    }
    else
    //Sleep(20);
    if(start)
    recevoir();
    }
    return msg.wParam;
    }
     
     
    //
    // FONCTION: MyRegisterClass()
    //
    // BUT: inscrit la classe de fentre.
    //
    // COMMENTAIRES:
    //
    // Cette fonction et son utilisation sont ncessaires uniquement si vous souhaitez que ce code
    // soit compatible avec les systmes Win32 avant la fonction 'RegisterClassEx'
    // qui a t ajoute Windows95. Il est important d'appeler cette fonction
    // afin que l'application dispose des petites icnes correctes qui lui sont
    // associes.
    //
    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_BASESERVER));
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName = MAKEINTRESOURCE(IDC_BASESERVER);
    wcex.lpszClassName = szWindowClass;
    wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
    return RegisterClassEx(&wcex);
    }
    //
    // FONCTION: InitInstance(HINSTANCE, int)
    //
    // BUT: enregistre le handle de l'instance et cre une fentre principale
    //
    // COMMENTAIRES:
    //
    // Dans cette fonction, nous enregistrons le handle de l'instance dans une variable globale, puis
    // crons et affichons la fentre principale du programme.
    //
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
    HWND hWnd;
    hInst = hInstance; // Stocke le handle d'instance dans la variable globale
    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
    if (!hWnd)
    {
    return FALSE;
    }
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    fenetre=hWnd;
    return TRUE;
    }
    //
    // FONCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
    //
    // BUT: traite les messages pour la fentre principale.
    //
    // WM_COMMAND - traite le menu de l'application
    // WM_PAINT - dessine la fentre principale
    // WM_DESTROY - gnre un message d'arrt et retourne
    //
    //
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    switch (message)
    {
    case WM_COMMAND:
    wmId = LOWORD(wParam);
    wmEvent = HIWORD(wParam);
    // Analyse les slections de menu:
    switch (wmId)
    {
    case IDM_ABOUT:
    DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
    break;
    case IDM_EXIT:
    DestroyWindow(hWnd);
    break;
    case ID_START:
    start=true;
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;
    EndPaint(hWnd, &ps);
    break;
    case WM_DESTROY:
    shutdown(hSocket,2); //envoi un paquet RST (fin de connection)
    closesocket(hSocket);
    PostQuitMessage(0);
    break;case WM_QUIT:
    shutdown(hSocket,2); //envoi un paquet RST (fin de connection)
    closesocket(hSocket);
    WSACleanup();
    PostQuitMessage(0);
    break;
    case ID_STOP:
    start=false;
    MessageBox(hWnd,"Server arrt !","",MB_ICONINFORMATION);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
    }
    // Gestionnaire de messages pour la bote de dialogue propos de.
    INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
    return (INT_PTR)TRUE;
    case WM_COMMAND:
    if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
    {
    EndDialog(hDlg, LOWORD(wParam));
    return (INT_PTR)TRUE;
    }
    break;
    }
    return (INT_PTR)FALSE;
    }
    void recevoir()
    {
    struct sockaddr udpaddrfrom; int fromlen = sizeof(udpaddrfrom);
    char Buffer[1024];
    char Buffer2[1024];
    int cbRead; 
     
    // Get an udp packet
    cbRead = recvfrom( hSocket, Buffer, sizeof(Buffer), 0, &udpaddrfrom, &fromlen );
    if( cbRead <= 0 )
    {
    MessageBox(NULL, "recvfrom() error "+ SOCKET_ERRNO,"",MB_OK );
    }
    // asciiZ string to print it
    Buffer[cbRead] = 0;
     
    int message=0;
    for(int i=10000,j=0;i>=1;i/=10,j++)
    {
    switch(Buffer[j])
    {
    case'0':
    message+=0*i;
    break;
    case'1':
    message+=1*i;
    break;
    case'2':
    message+=2*i;
    break;
    case'3':
    message+=3*i;
    break;
    case'4':
    message+=4*i;
    break;
    case'5':
    message+=5*i;
    break;
    case'6':
    message+=6*i;
    break;
    case'7':
    message+=7*i;
    break;
    case'8':
    message+=8*i;
    break;
    case'9':
    message+=9*i;
    break;
    default:
     
    break;
    }
    }
    for(int i=0;i<1018;i++)
    {
    Buffer[i]=Buffer[i+6];
    }
    Buffer[1018]=0;
    switch(message)
    {
    case 0:
    afficher_log("erreur de message");
    break;
    case STOPSERVER:
    SendMessage(fenetre,ID_STOP,0,0);
    char Buffer[10];
    break;
    case MESSAGE:
    sprintf(Buffer2, "recvfrom()=>cbRead=%d, Buffer=%s\n", cbRead, Buffer );
    afficher_log(Buffer2);
    break;
    }
    }
     
     
    void afficher_log(char* quoi)
    {
    MessageBox(NULL,quoi,"",MB_ICONINFORMATION);
    }
    le code coté client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    // baseclientserver.cpp: dfinit le point d'entre pour l'application.
    //
    #include"stdafx.h"
    #include<winsock2.h>
    #pragmacomment(lib, "ws2_32.lib")
    #include"baseclient.h"
    #include<windows.h>
    #include<stdio.h>
    #include"..\definitions.h"
    #define MAX_LOADSTRING 100
    #define SOCKET_ERRNO WSAGetLastError()
    #define nPort 1812
    // Variables globales:
    HINSTANCE hInst; // instance actuelle
    TCHAR szTitle[MAX_LOADSTRING]; // Le texte de la barre de titre
    TCHAR szWindowClass[MAX_LOADSTRING]; // le nom de la classe de fentre principale
     
    // Pr-dclarations des fonctions incluses dans ce module de code:
    ATOM MyRegisterClass(HINSTANCE hInstance);
    BOOL InitInstance(HINSTANCE, int);
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
    HRESULT EnvoieDonnees(char* data);
    void afficher_log(char* quoi);
    staticstruct sockaddr UdpFormatAdress( 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 dfinir dans le projet WIN16 */
    _fmemcpy (&addr.sin_addr, lphost->h_addr, lphost->h_length);
    #else/* WIN32*/
    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;
    }
     
     
     
    SOCKET hSocket; 
    struct sockaddr_in addr;
    struct sockaddr udpaddr;
    char szHost[256] = "localhost";
    WSADATA stack_info;
     
    int APIENTRY _tWinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPTSTR lpCmdLine,
    int nCmdShow)
    {
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);
    // TODO: placez ici le code.
    WSAStartup(MAKEWORD(2,0), &stack_info );
    //MessageBox(NULL, "Usage <host> <port>\nUsing default=localhost 1812","",MB_ICONINFORMATION );
    hSocket = socket( PF_INET, SOCK_DGRAM, 0 );
    if( hSocket == INVALID_SOCKET )
    {
    MessageBox(NULL, "socket() error"+ SOCKET_ERRNO,"",MB_ICONERROR );
    return -1;
    }
    addr.sin_family = AF_INET ;
    addr.sin_addr.s_addr = htonl (INADDR_ANY);
    addr.sin_port = htons ((unsignedshort)0 );
    if ( bind( hSocket, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR )
    {
    MessageBox(NULL, "bind() error "+ SOCKET_ERRNO,"",MB_ICONERROR );
    return -1;
    }
    udpaddr = UdpFormatAdress( szHost, (u_short)nPort );
    //Fin de TODO
    MSG msg;
    HACCEL hAccelTable;
    // Initialise les chanes globales
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_BASECLIENTSERVER, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);
    // Effectue l'initialisation de l'application:
    if (!InitInstance (hInstance, nCmdShow))
    {
    return FALSE;
    }
    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_BASECLIENTSERVER));
    // Boucle de messages principale:
    while (GetMessage(&msg, NULL, 0, 0))
    {
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    }
    return (int) msg.wParam;
    }
     
     
    //
    // FONCTION: MyRegisterClass()
    //
    // BUT: inscrit la classe de fentre.
    //
    // COMMENTAIRES:
    //
    // Cette fonction et son utilisation sont ncessaires uniquement si vous souhaitez que ce code
    // soit compatible avec les systmes Win32 avant la fonction 'RegisterClassEx'
    // qui a t ajoute Windows95. Il est important d'appeler cette fonction
    // afin que l'application dispose des petites icnes correctes qui lui sont
    // associes.
    //
    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_BASECLIENTSERVER));
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName = MAKEINTRESOURCE(IDC_BASECLIENTSERVER);
    wcex.lpszClassName = szWindowClass;
    wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
    return RegisterClassEx(&wcex);
    }
    //
    // FONCTION: InitInstance(HINSTANCE, int)
    //
    // BUT: enregistre le handle de l'instance et cre une fentre principale
    //
    // COMMENTAIRES:
    //
    // Dans cette fonction, nous enregistrons le handle de l'instance dans une variable globale, puis
    // crons et affichons la fentre principale du programme.
    //
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
    HWND hWnd;
    hInst = hInstance; // Stocke le handle d'instance dans la variable globale
    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
    if (!hWnd)
    {
    return FALSE;
    }
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    return TRUE;
    }
    //
    // FONCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
    //
    // BUT: traite les messages pour la fentre principale.
    //
    // WM_COMMAND - traite le menu de l'application
    // WM_PAINT - dessine la fentre principale
    // WM_DESTROY - gnre un message d'arrt et retourne
    //
    //
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    char Buffer[1024];
    switch (message)
    {
    case WM_COMMAND:
    wmId = LOWORD(wParam);
    wmEvent = HIWORD(wParam);
    // Analyse les slections de menu:
    switch (wmId)
    {
    case IDM_ABOUT:
    DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
    break;
    case IDM_EXIT:
    DestroyWindow(hWnd);
    break;
    case ID_SERVER_TEST:
    sprintf(Buffer, "%d Message envoye", MESSAGE);
    EnvoieDonnees(Buffer);
    break;
    case ID_SERVER_STOP:
    sprintf(Buffer, "%d", STOPSERVER);
    EnvoieDonnees(Buffer);
    break;
    case WM_QUIT:
    shutdown(hSocket,2); //envoi un paquet RST (fin de connection)
    closesocket(hSocket);
    WSACleanup();
    PostQuitMessage(0);
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;
    case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    // TODO: ajoutez ici le code de dessin...
    EndPaint(hWnd, &ps);
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
    }
    // Gestionnaire de messages pour la bote de dialogue propos de.
    INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
    return (INT_PTR)TRUE;
    case WM_COMMAND:
    if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
    {
    EndDialog(hDlg, LOWORD(wParam));
    return (INT_PTR)TRUE;
    }
    break;
    }
    return (INT_PTR)FALSE;
    }
     
    HRESULT EnvoieDonnees(char* data)
    {
    char Buffer[1024];
    int cbBuffer;
    cbBuffer = sprintf(Buffer, "%s", data);
    // Build a buffer to send
    
    // send it
    if( sendto( hSocket, Buffer, cbBuffer, 0, &udpaddr, sizeof(udpaddr) ) == SOCKET_ERROR )
    {
    MessageBox(NULL, "sendto() error "+ SOCKET_ERRNO,"",MB_ICONERROR );
    return -1;
    }
    return S_OK;
    }
     
    void afficher_log(char* quoi)
    {
    MessageBox(NULL,quoi,"",MB_ICONINFORMATION);
    }
    le code commun (les definitions):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    
    #define STOPSERVER 10000
    #define MESSAGE 10001
    #define REPONSEOK 10002
    
    Quelqu'un pourrait-il m'aider?

    raphchar

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 210
    Points : 12 381
    Points
    12 381
    Par défaut
    Il faut que le serveur appel la fonction "sento" avec les paramètres de retour remplis (udpaddrfrom) lors de son appel à la fonction "recvfrom".
    Idem pour le client, il doit appeler "recvfrom" après son appel à "sento".

    Vous utilisez le protocole UDP qui est un protocole sans connexion, c'est à vous de gérer/créer le protocole de niveau applicatif. En clair, il faut que vous sachiez quand un programme doit attendre des données ou en envoyer.

    Si vous n'êtes pas un habitué de la programmation réseaux, utilisez un protocole avec connexion comme TCP qui permet de gérer un flux de données montant (vers le programme, client ou serveur), et un flux de données descendant (envoyé depuis le programme).

  3. #3
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut
    Merci pour la reponse
    Citation Envoyé par bacelar Voir le message
    Vous utilisez le protocole UDP qui est un protocole sans connexion, c'est à vous de gérer/créer le protocole de niveau applicatif. En clair, il faut que vous sachiez quand un programme doit attendre des données ou en envoyer.

    Si vous n'êtes pas un habitué de la programmation réseaux, utilisez un protocole avec connexion comme TCP qui permet de gérer un flux de données montant (vers le programme, client ou serveur), et un flux de données descendant (envoyé depuis le programme).
    En fait, vu que ça marche comme ça, je n'ai pas vraiment envie de changer, d'autre part, je m'arrangerait que pour le coté client, la fonction recvfrom ne soit appellée que dans un cas de nécessité. Du coté serveur, il n'y a aucun besoin que le programme soit accessible une fois lancé, dont même si cette fonction bloque tout, ce n'est pas si important.

    raphchar

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Sécuriser une application client/server.
    Par wadabush dans le forum C++
    Réponses: 3
    Dernier message: 04/09/2012, 00h01
  2. creer une archicteture client/server
    Par samheir dans le forum C#
    Réponses: 1
    Dernier message: 20/05/2009, 10h56
  3. Verrouillage d’enregistrement dans une application Client/server
    Par touhami dans le forum Connexion aux bases de données
    Réponses: 13
    Dernier message: 07/07/2008, 23h05
  4. conception et réalisation d'une application client/serveur
    Par masvivi dans le forum Développement
    Réponses: 1
    Dernier message: 24/08/2005, 13h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo