Bonjour,

J'ai fais des modifications sur le cexpl0rer3.hpp (un client requete HTTP).
J'ai implementer un timeout pour le chargement du page Web en programmation et
je voudrais savoir si mon code est correcte dans le cas de thread ?
J'ai rajouter la variable timeoutrecv,
il ferme la connexion si le temps d'attente de reception de donnée est trop longue.


Merci


Code modifier :

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
typedef struct {
	Socket *sck;
	std::string *content;
	size_t ret;
}TRCV,*PRCV;
 
DWORD WINAPI taskreceive(LPVOID _p)
{
	PRCV p=(PRCV)_p;
	size_t ret = 0;
	 size_t recvSz,
         recvSzTot = 0;
	 char buff[BUFSIZ];
	 p->content->erase(0,p->content->length());
 
 
      while ((recvSz = ::recv(p->sck->mSock, buff, BUFSIZ, 0)) > 0)
      {
         *(p->content) += std::string(buff, recvSz);
       recvSzTot += recvSz;
		 if (p->sck->status!=NULL)
			 p->sck->status(p->sck->param,recvSzTot,recvSz);
      } 
	  ret = recvSzTot;
	  p->ret=ret;
	  return 0;
}
 
size_t Socket::recv(std::string &content)
{
	size_t ret = 0;
 
   if (this->isConnected())
   {
      size_t recvSz,
         recvSzTot = 0;
      char buff[BUFSIZ];
	  TRCV tr;
	  tr.ret=0;
	  tr.sck=this;
	  tr.content=&content;
	  if (timeoutrecv==0)
	  {
		  taskreceive(&tr); //on 
	  }
	  else
	  {
		  HANDLE ht=CreateThread(NULL,0,taskreceive,&tr,0,NULL);
		  if (WaitForSingleObject(ht,timeoutrecv)!=0)
		  {
 
			  close();
		  }
                  TerminateThread(ht,-1);
	  }
	  ret=tr.ret;
 
   }
   else
   {
      if (this->connect())
         ret = this->recv(content);
   }
   return ret;
}