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