better EINTR handling

This commit is contained in:
z3APA3A 2014-06-11 01:54:25 +04:00
parent 40d03b8a4a
commit 443a4c02d0
2 changed files with 9 additions and 5 deletions

View File

@ -47,7 +47,7 @@ int socksendto(SOCKET sock, struct sockaddr_in * sin, unsigned char * buf, int b
if(res < 1) break; if(res < 1) break;
res = so._sendto(sock, buf + sent, bufsize - sent, 0, (struct sockaddr *)sin, sizeof(struct sockaddr_in)); res = so._sendto(sock, buf + sent, bufsize - sent, 0, (struct sockaddr *)sin, sizeof(struct sockaddr_in));
if(res < 0) { if(res < 0) {
if(errno != EAGAIN) break; if(errno != EAGAIN && errno != EINTR) break;
continue; continue;
} }
sent += res; sent += res;

View File

@ -130,7 +130,8 @@ int sockmap(struct clientparam * param, int timeo){
} }
res = so._sendto(param->clisock, param->srvbuf + param->srvoffset,(!param->waitserver || ((unsigned)param->waitserver - received) > (param->srvinbuf - param->srvoffset))? param->srvinbuf - param->srvoffset : param->waitserver - received, 0, (struct sockaddr*)&param->sinc, sasize); res = so._sendto(param->clisock, param->srvbuf + param->srvoffset,(!param->waitserver || ((unsigned)param->waitserver - received) > (param->srvinbuf - param->srvoffset))? param->srvinbuf - param->srvoffset : param->waitserver - received, 0, (struct sockaddr*)&param->sinc, sasize);
if(res < 0) { if(res < 0) {
if(errno != EAGAIN) return 96; if(errno != EAGAIN && errno != EINTR) return 96;
if(errno == EINTR) usleep(SLEEPTIME);
continue; continue;
} }
param->srvoffset += res; param->srvoffset += res;
@ -155,7 +156,8 @@ int sockmap(struct clientparam * param, int timeo){
} }
res = so._sendto(param->remsock, param->clibuf + param->clioffset, (!param->waitclient || ((unsigned)param->waitclient - sent) > (param->cliinbuf - param->clioffset))? param->cliinbuf - param->clioffset : param->waitclient - sent, 0, (struct sockaddr*)&param->sins, sasize); res = so._sendto(param->remsock, param->clibuf + param->clioffset, (!param->waitclient || ((unsigned)param->waitclient - sent) > (param->cliinbuf - param->clioffset))? param->cliinbuf - param->clioffset : param->waitclient - sent, 0, (struct sockaddr*)&param->sins, sasize);
if(res < 0) { if(res < 0) {
if(errno != EAGAIN) return 97; if(errno != EAGAIN && errno != EINTR) return 97;
if(errno == EINTR) usleep(SLEEPTIME);
continue; continue;
} }
param->clioffset += res; param->clioffset += res;
@ -180,7 +182,8 @@ int sockmap(struct clientparam * param, int timeo){
} }
else { else {
if (res < 0){ if (res < 0){
if( errno != EAGAIN) return (94); if(errno != EAGAIN && errno != EINTR) return 94;
if(errno == EINTR) usleep(SLEEPTIME);
continue; continue;
} }
param->cliinbuf += res; param->cliinbuf += res;
@ -210,7 +213,8 @@ int sockmap(struct clientparam * param, int timeo){
} }
else { else {
if (res < 0){ if (res < 0){
if( errno != EAGAIN) return (93); if(errno != EAGAIN && errno != EINTR) return 93;
if(errno == EINTR) usleep(SLEEPTIME);
continue; continue;
} }
param->srvinbuf += res; param->srvinbuf += res;