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;
} |
Partager