cTimeMs tim;
do {
r=timeout;
- if(blockmode) { r-=tim.Elapsed(); if(r<10) r=10; }
+ if(r>0 && blockmode) { r-=tim.Elapsed(); if(r<10) r=10; }
r=Select(true,r);
if(r>0) {
r=LOOP_EINTR(read(sd,data+cnt,len-cnt));
int cnt=0, r;
cTimeMs tim;
do {
- r=timeout-tim.Elapsed(); if(r<10) r=10;
+ r=timeout;
+ if(r>0) { r-=tim.Elapsed(); if(r<10) r=10; }
r=Select(false,r);
if(r>0) {
r=LOOP_EINTR(write(sd,data+cnt,len-cnt));
if(GetAddr(&saddr,Host,Port)) {
cTimeMs tim;
do {
- r=timeout-tim.Elapsed(); if(r<10) r=10;
+ r=timeout;
+ if(r>0) { r-=tim.Elapsed(); if(r<10) r=10; }
r=Select(false,r);
if(r>0) {
r=LOOP_EINTR(sendto(sd,data+cnt,len-cnt,0,(struct sockaddr *)&saddr,sizeof(saddr)));
int cCardClientCamd35::RecvBlock(struct CmdBlock *cb, int maxlen, int to)
{
unsigned char *m=(unsigned char *)cb;
- if(cCardClient::RecvMsg(m,16+UCSIZE(cb),to)<0) {
- PRINTF(L_CC_CAMD35,"short packet received");
+ int n=cCardClient::RecvMsg(m,16+UCSIZE(cb),to);
+ if(n<=0) {
+ if(n<0) PRINTF(L_CC_CAMD35,"short packet received");
return -1;
}
Decrypt(m+UCSIZE(cb),16);
- int n=cb->udp_header.len+HDSIZE(cb);
+ n=cb->udp_header.len+HDSIZE(cb);
if(n>maxlen) {
PRINTF(L_CC_CAMD35,"received buffer overflow");
return -1;
if(!so.Connected() && !Login()) return -1;
int n=so.Read(data,len,to);
if(n<0) {
- if(len<0 && errno==ETIMEDOUT) return 0;
+ if(errno==ETIMEDOUT && (len<0 || to==0)) return 0;
PRINTF(L_CC_CORE,"recv error. reconnecting...");;
Logout();
}