cs_aardman
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
28 juil. 2003 à 22:34
Salut,
j'ai fait un petit serveur pour tester, une simple dialogbox avec un bouton grisé par defaut.
Lorsqu'un client se connecte, le bouton deviens clickable et lorsqu'on clique dessus il appelle la fonction recv(). La valeur que retourne recv est affichée dans une MessageBox. Lorsque le client se deconnecte, le bouton redeviens grisé.
Alors je lance le prog, je fais un telnet dessus, le bouton deviens clickable, je clique dessus et la MessageBox affiche -1.
Et lorsque je ferme telnet, le bouton deviens grisé.
C'est un socket non bloquant, et recv retourne -1 alors que le client est toujours connecté.
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
#include "resource.h"
#pragma comment(lib, "ws2_32.lib")
#define WM_SOCKET 0x0401
SOCKET s;
SOCKET c;
sockaddr_in sin;
int Size = sizeof(sin);
int iReturnValue = 0;
HWND hButton;
char szBuf[256];
char szMsg[256];
BOOL CALLBACK AppDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
WSADATA wsa;
WSAStartup(MAKEWORD(2,0), &wsa);
DialogBox(hInstance, "MainDialog", 0, AppDlgProc);
return 0;
}
BOOL CALLBACK AppDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG:
hButton = GetDlgItem(hDlg, IDOK);
EnableWindow(hButton, FALSE);
s = socket(AF_INET, SOCK_STREAM, 0);
sin.sin_family = AF_INET;
sin.sin_port = htons(2003);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
bind(s,(sockaddr *) &sin, Size);
listen(s, 5);
WSAAsyncSelect(s, hDlg, WM_SOCKET, FD_ACCEPT | FD_CLOSE);
return 0;
case WM_SOCKET:
if(LOWORD(lParam) == FD_ACCEPT)
{
c = accept(s,(sockaddr *) &sin, &Size);
EnableWindow(hButton, TRUE);
}
if(LOWORD(lParam) == FD_CLOSE)
{
EnableWindow(hButton, FALSE);
}
return 0;
case WM_COMMAND:
switch(wParam)
{
case IDOK:
iReturnValue = recv(c, szBuf, sizeof(szBuf), 0);
sprintf(szMsg, "recv retourne %d.", iReturnValue);
MessageBox(0, szMsg, "Valeur de retour de recv()", MB_OK);
return 0;
case IDCANCEL: EndDialog(hDlg, 0);
}
}
return 0;
}