Bonjour,
Je suis entrain de développer un client TCP qui se connecte de manière asynchrone à un serveur. Pour ce faire j'utilise la fonction WSAAsyncselect().
Mon problème est le suivant. Le client envoie une demande de connexion via la fonction connect(). Cette dernière génère un évènement FD_ACCEPT sur le serveur. Il accepte la connexion par la fonction accept(). Une fois que la connexion est établie, la CALLBACK fonction du client n'est pas appelée : l'évènement FD_CONNECT n'est pas généré. Malgré mes recherches sur internet, je ne suis pas en mesure d'identifier le problème.
Ci-dessous se trouve le code du client TCP :
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#define DEFAULT_PORT 5150
#define WM_SOCKET (WM_USER + 1)
HWND MakeWorkerWindow(void);
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int main(int argc, char **argv)
{
WSADATA wsd;
SOCKET sClient;
int ret, i;
struct sockaddr_in server;
struct hostent *host = NULL;
HWND Window;
if ((Window = MakeWorkerWindow()) == NULL)
{
printf("MakeWorkerWindow() failed!\n");
return 1;
}
else
{
printf("MakeWorkerWindow() is OK!\n");
}
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("Failed to load Winsock library! Error %d\n", WSAGetLastError());
return 1;
}
else
{
printf("Winsock library loaded successfully!\n");
}
// Create the socket, and attempt to connect to the server
sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sClient == INVALID_SOCKET)
{
printf("socket() failed with error code %d\n", WSAGetLastError());
return 1;
}
else
{
printf("socket() looks fine!\n");
}
if (WSAAsyncSelect(sClient, Window, WM_SOCKET, FD_CONNECT | FD_READ| FD_WRITE) == 0)
{
printf("WSAAsyncSelect() is OK lol!\n");
}
else
{
printf("WSAAsyncSelect() failed with error code %d\n", WSAGetLastError());
}
server.sin_family = AF_INET;
server.sin_port = htons(DEFAULT_PORT);
server.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(sClient, (struct sockaddr *)&server, sizeof(server));
for(;;)
{
}
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
printf("Message is %d\n", uMsg);
if (uMsg == WM_SOCKET)
{
if (WSAGETSELECTERROR(lParam))
{
printf("Socket failed with error %d\n", WSAGETSELECTERROR(lParam));
}
else
{
printf("Socket looks fine!\n");
switch(WSAGETSELECTEVENT(lParam))
{
case FD_CONNECT:
printf("Socket number %d connected\n", wParam);
break;
case FD_READ:
printf("Server can read\n");
break;
case FD_WRITE:
printf("Server can be written\n");
break;
}
}
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
HWND MakeWorkerWindow(void)
{
WNDCLASS wndclass;
CHAR *ProviderClass = "AsyncSelect";
HWND Window;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = (WNDPROC)WindowProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = NULL;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = ProviderClass;
if (RegisterClass(&wndclass) == 0)
{
printf("RegisterClass() failed with error %d\n", GetLastError());
return NULL;
}
else
{
printf("RegisterClass() is OK!\n");
}
// Create a window
if ((Window = CreateWindow(
ProviderClass,
"",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
NULL,
NULL)) == NULL)
{
printf("CreateWindow() failed with error %d\n", GetLastError());
return NULL;
}
else
{
printf("CreateWindow() is OK!\n");
}
return Window;
}