Client server multihread !
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
Code:
1 2 3 4
| typedef struct MYVAR{
CListBox* mylist;
SOCKET* handle;
}MYVAR; |
le thread du serveur
Code:
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);
} |
et le thread du client ou j'ai l'erreur
Code:
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 |
l'erreur est :
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