Bonjour
J'ai un probleme que je ne comprend pas.
J'essae de realiser un serveur pouvant accepter plusieurs clients
pour cela je crée un thread du serveur pour pouvoir accepter toute les connexions entrantes et un thread client quand un client est accepté mon souci est que je n'arrive pas a attacher le handle de la socket du client
le code
un typedef pour passer met variable a travers les thread
le thread du serveur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 typedef struct MYVAR{ CListBox* mylist; SOCKET* handle; }MYVAR;
et le thread du client ou j'ai l'erreur
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 MYVAR* thevarserver = (MYVAR*)Param; if (!AfxSocketInit()) thevarserver->mylist->AddString("Init socket not OK"); //initialisation des sockets CSocket *Lsocket=new CSocket; //socket d'ecoute CSocket *Wsocket=new CSocket; //socket de travail SOCKET hConnected; //handle de socket, pour le passage a l'autre thread if (Lsocket->Create(PORT,SOCK_STREAM)) //creation de a socket TCP (pour UDP: SOCK_DGRAM) { thevarserver->mylist->AddString("Server started"); Lsocket->Listen(); //mise de la socket en mode écoute (pas mode réception) thevarserver->mylist->AddString("Listen started"); while(1) { mutex.Lock(); //prend le mutex Lsocket->Accept(*Wsocket); //Redirige la connection entrante sur la socket de travail hConnected = Wsocket->Detach(); //recupere les parametres de la socket de travail MYVAR * thevarclient = new MYVAR; thevarclient->mylist = thevarserver->mylist; thevarclient->handle = &hConnected; AfxBeginThread(Client,thevarclient);//lance la fonction travail comme nouveau thread, avec parametre de socket thevarserver->mylist->AddString("wait for client"); thevarserver->mylist->EnableWindow(true); }
l'erreur est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 UINT CMyServerDlg::Client(LPVOID sock) { MYVAR* thevarclient = (MYVAR*)sock; char rdBuf[100]; CSocket *Wsocket=new CSocket; //socket de travail Wsocket->Attach(*thevarclient->handle); //parametrage de la nouvelle socket de travail
DEBUG ASSERTION FAILED
Program...
File: f:\sp\vctools\vc7libs\ship\atlmfc\src\mfc\map_pp.cpp
Line : 179
ensuivant pas pas j'arrive a
ASSERT(CAsyncSocket::LookupHandle(hSocket, bDead) == NULL);
dans sockcore.cpp fonction void PASCAL CAsyncSocket::AttachHandle(SOCKET hSocket, CAsyncSocket* pSocket, BOOL bDead)
qui me cree l'assertion
cordialement
Partager