{
int k, l_sendedsize;
int l_connfd=connfd;
int l_size=size;
int ret;
k = 0;
l_sendedsize = 0;
struct timeval timeout;
fd_set rw;
while(1)
{
FD_ZERO(&rw);
FD_SET(connfd, &rw);
timeout.tv_sec = 20;
timeout.tv_usec =0;
ret = select(connfd+1, NULL, &rw, NULL, &timeout);
if(ret == -1) {
APP_ERR("err: select -1");
return -1;
}
else if(ret == 0) {
APP_ERR("err : select timeout, fd:%d, %d", connfd, WSAGetLastError());
return 0;
}
else {
if(FD_ISSET(connfd, &rw)) {
k = send(l_connfd, src + l_sendedsize, l_size - l_sendedsize, 0);
if(k<=0) {
APP_ERR("send err:%d", WSAGetLastError());
return -3;
}
} else {
APP_ERR("FD_ISSET err");
return -1;
}
}
l_sendedsize += k;
if (l_sendedsize == l_size)
{
return 0;
}
}
}
int blockRcv(unsigned int connfd, char *dst, int size)
{
int k, l_recvedsize;
int l_connfd=connfd;
int l_size=size;
int ret;
k = 0;
l_recvedsize = 0;
struct timeval timeout;
fd_set rw;
while(1)
{
FD_ZERO(&rw);
FD_SET(connfd, &rw);
timeout.tv_sec = 20;
timeout.tv_usec =0;
ret = select(connfd+1, &rw, NULL, NULL, &timeout);
if(ret == -1) {
APP_ERR("err!! select -1");
return -1;
}
else if(ret == 0) {
APP_ERR("select timeout, fd:%d, %d", connfd, WSAGetLastError());
return 0;
}
else {
if(FD_ISSET(connfd, &rw)) {
k = recv(l_connfd, dst + l_recvedsize, l_size - l_recvedsize, 0);
if(k<=0) {
APP_ERR("recv err:%d", WSAGetLastError());
return -3;
}
} else {
APP_ERR("FD_ISSET err");
return -1;
}
}
l_recvedsize += k;
if (l_recvedsize == l_size)
{
return 0;
}
}
}