mirror of
https://github.com/lxsang/ant-http
synced 2024-12-25 16:28:21 +01:00
add timeout to io read write
This commit is contained in:
parent
50b248c9e2
commit
d391b78109
BIN
dist/antd-1.0.4b.tar.gz
vendored
BIN
dist/antd-1.0.4b.tar.gz
vendored
Binary file not shown.
29
lib/handle.c
29
lib/handle.c
@ -210,9 +210,16 @@ int antd_send(void *src, const void* data, int len)
|
|||||||
{
|
{
|
||||||
written += count;
|
written += count;
|
||||||
writelen = (len - written) > BUFFLEN?BUFFLEN:(len-written);
|
writelen = (len - written) > BUFFLEN?BUFFLEN:(len-written);
|
||||||
|
time(&source->last_io);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if(difftime( time(NULL), source->last_io) > MAX_IO_WAIT_TIME)
|
||||||
|
{
|
||||||
|
if(written == 0)
|
||||||
|
written = count;
|
||||||
|
break;
|
||||||
|
}
|
||||||
//printf(" received equal to or less than 0\n")
|
//printf(" received equal to or less than 0\n")
|
||||||
switch (err)
|
switch (err)
|
||||||
{
|
{
|
||||||
@ -300,12 +307,13 @@ int antd_send(void *src, const void* data, int len)
|
|||||||
{
|
{
|
||||||
written += count;
|
written += count;
|
||||||
writelen = (len - written) > BUFFLEN?BUFFLEN:(len-written);
|
writelen = (len - written) > BUFFLEN?BUFFLEN:(len-written);
|
||||||
|
time(&source->last_io);
|
||||||
}
|
}
|
||||||
else if(errno != EAGAIN && errno != EWOULDBLOCK)
|
else if(difftime( time(NULL), source->last_io) > MAX_IO_WAIT_TIME || (count == -1 && errno != EAGAIN && errno != EWOULDBLOCK))
|
||||||
{
|
{
|
||||||
if(written == 0)
|
if(written == 0)
|
||||||
written = count;
|
written = count;
|
||||||
ERROR("Error while writing: %s", strerror(errno));
|
//ERROR("Error while writing: %s", strerror(errno));
|
||||||
break;
|
break;
|
||||||
//return written;
|
//return written;
|
||||||
}
|
}
|
||||||
@ -317,8 +325,6 @@ int antd_send(void *src, const void* data, int len)
|
|||||||
{
|
{
|
||||||
antd_close(src);
|
antd_close(src);
|
||||||
}*/
|
}*/
|
||||||
if(written > 0)
|
|
||||||
time(&source->last_io);
|
|
||||||
return written;
|
return written;
|
||||||
}
|
}
|
||||||
int antd_recv(void *src, void* data, int len)
|
int antd_recv(void *src, void* data, int len)
|
||||||
@ -346,9 +352,17 @@ int antd_recv(void *src, void* data, int len)
|
|||||||
{
|
{
|
||||||
read += received;
|
read += received;
|
||||||
readlen = (len - read) > BUFFLEN?BUFFLEN:(len-read);
|
readlen = (len - read) > BUFFLEN?BUFFLEN:(len-read);
|
||||||
|
time(&source->last_io);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// Timeout, quit
|
||||||
|
if(difftime( time(NULL), source->last_io) > MAX_IO_WAIT_TIME)
|
||||||
|
{
|
||||||
|
if(read == 0)
|
||||||
|
read = received;
|
||||||
|
break;
|
||||||
|
}
|
||||||
//printf(" received equal to or less than 0\n")
|
//printf(" received equal to or less than 0\n")
|
||||||
switch (err)
|
switch (err)
|
||||||
{
|
{
|
||||||
@ -447,7 +461,7 @@ int antd_recv(void *src, void* data, int len)
|
|||||||
ptr = (char* )data;
|
ptr = (char* )data;
|
||||||
readlen = len > BUFFLEN?BUFFLEN:len;
|
readlen = len > BUFFLEN?BUFFLEN:len;
|
||||||
read = 0;
|
read = 0;
|
||||||
while (readlen > 0 )//&& source->attempt < MAX_ATTEMPT
|
while (readlen > 0 )
|
||||||
{
|
{
|
||||||
received = recv(((int) source->sock), ptr+read, readlen, 0);
|
received = recv(((int) source->sock), ptr+read, readlen, 0);
|
||||||
//LOG("Read : %c\n", *ptr);
|
//LOG("Read : %c\n", *ptr);
|
||||||
@ -455,9 +469,10 @@ int antd_recv(void *src, void* data, int len)
|
|||||||
{
|
{
|
||||||
read += received;
|
read += received;
|
||||||
readlen = (len - read) > BUFFLEN?BUFFLEN:(len-read);
|
readlen = (len - read) > BUFFLEN?BUFFLEN:(len-read);
|
||||||
|
time(&source->last_io);
|
||||||
//LOG("Read len is %d\n", readlen);
|
//LOG("Read len is %d\n", readlen);
|
||||||
}
|
}
|
||||||
else if(errno != EAGAIN && errno != EWOULDBLOCK)
|
else if( difftime( time(NULL), source->last_io) > MAX_IO_WAIT_TIME || (errno != EAGAIN && errno != EWOULDBLOCK))
|
||||||
{
|
{
|
||||||
//ERROR("Error while reading: %s", strerror(errno));
|
//ERROR("Error while reading: %s", strerror(errno));
|
||||||
if(read ==0)
|
if(read ==0)
|
||||||
@ -474,8 +489,6 @@ int antd_recv(void *src, void* data, int len)
|
|||||||
{
|
{
|
||||||
antd_close(src);
|
antd_close(src);
|
||||||
}*/
|
}*/
|
||||||
if(read > 0)
|
|
||||||
time(&source->last_io);
|
|
||||||
return read;
|
return read;
|
||||||
}
|
}
|
||||||
void set_nonblock(int socket) {
|
void set_nonblock(int socket) {
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
#define __RESULT__ "{\"result\":%d,\"msg\":\"%s\"}"
|
#define __RESULT__ "{\"result\":%d,\"msg\":\"%s\"}"
|
||||||
#define FORM_URL_ENCODE "application/x-www-form-urlencoded"
|
#define FORM_URL_ENCODE "application/x-www-form-urlencoded"
|
||||||
#define FORM_MULTI_PART "multipart/form-data"
|
#define FORM_MULTI_PART "multipart/form-data"
|
||||||
#define MAX_WAIT_S 2 // 1/3 minute
|
#define MAX_IO_WAIT_TIME 5 // second
|
||||||
|
|
||||||
//extern config_t server_config;
|
//extern config_t server_config;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user