implemented simple idle timeout on the server.
added --shutwr to the sample client code
This commit is contained in:
34
lib/main-c.c
34
lib/main-c.c
@ -501,7 +501,7 @@ static int feed_data (hcl_client_t* client, const void* ptr, hcl_oow_t len)
|
||||
|
||||
/* ========================================================================= */
|
||||
|
||||
static int handle_request (hcl_client_t* client, const char* ipaddr, const char* script)
|
||||
static int handle_request (hcl_client_t* client, const char* ipaddr, const char* script, int shut_wr_after_req)
|
||||
{
|
||||
hcl_sckaddr_t sckaddr;
|
||||
hcl_scklen_t scklen;
|
||||
@ -576,6 +576,8 @@ static int handle_request (hcl_client_t* client, const char* ipaddr, const char*
|
||||
iov[index].iov_len -= nwritten;
|
||||
}
|
||||
|
||||
if (shut_wr_after_req) shutdown (sck, SHUT_WR);
|
||||
|
||||
client_xtn->data_length = 0;
|
||||
client_xtn->reply_count = 0;
|
||||
|
||||
@ -583,7 +585,7 @@ static int handle_request (hcl_client_t* client, const char* ipaddr, const char*
|
||||
avail = 0;
|
||||
while (client_xtn->reply_count == 0)
|
||||
{
|
||||
n = read(sck, &buf[avail], HCL_SIZEOF(buf) - avail); /* switch to recv */
|
||||
n = recv(sck, &buf[avail], HCL_SIZEOF(buf) - avail, 0);
|
||||
if (n <= -1)
|
||||
{
|
||||
fprintf (stderr, "Unable to read from %d - %s\n", sck, strerror(n));
|
||||
@ -601,7 +603,11 @@ static int handle_request (hcl_client_t* client, const char* ipaddr, const char*
|
||||
|
||||
avail += n;;
|
||||
x = hcl_client_feed(client, buf, avail, &used);
|
||||
if (x <= -1) goto oops;
|
||||
if (x <= -1)
|
||||
{
|
||||
fprintf (stderr, "Client error [%d]\n", hcl_client_geterrnum(client));
|
||||
goto oops;
|
||||
}
|
||||
|
||||
avail -= used;
|
||||
if (avail > 0) memmove (&buf[0], &buf[used], avail);
|
||||
@ -622,6 +628,7 @@ int main (int argc, char* argv[])
|
||||
static hcl_bopt_lng_t lopt[] =
|
||||
{
|
||||
{ ":log", 'l' },
|
||||
{ "shutwr", '\0' },
|
||||
{ HCL_NULL, '\0' }
|
||||
};
|
||||
static hcl_bopt_t opt =
|
||||
@ -635,14 +642,14 @@ int main (int argc, char* argv[])
|
||||
hcl_client_prim_t client_prim;
|
||||
int n;
|
||||
const char* logopt = HCL_NULL;
|
||||
int shut_wr_after_req = 0;
|
||||
|
||||
setlocale (LC_ALL, "");
|
||||
|
||||
|
||||
if (argc < 2)
|
||||
{
|
||||
print_usage:
|
||||
fprintf (stderr, "Usage: %s bind-address:port script-to-run\n", argv[0]);
|
||||
fprintf (stderr, "Usage: %s [-l/--log log-options] [--shutwr] bind-address:port script-to-run\n", argv[0]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -655,7 +662,14 @@ int main (int argc, char* argv[])
|
||||
break;
|
||||
|
||||
case '\0':
|
||||
goto print_usage;
|
||||
if (hcl_compbcstr(opt.lngopt, "shutwr") == 0)
|
||||
{
|
||||
shut_wr_after_req = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
goto print_usage;
|
||||
}
|
||||
break;
|
||||
|
||||
case ':':
|
||||
@ -706,18 +720,12 @@ int main (int argc, char* argv[])
|
||||
set_signal (SIGINT, handle_sigint);
|
||||
set_signal_to_ignore (SIGPIPE);
|
||||
|
||||
|
||||
n = handle_request (client, argv[opt.ind], argv[opt.ind + 1]);
|
||||
n = handle_request (client, argv[opt.ind], argv[opt.ind + 1], shut_wr_after_req);
|
||||
|
||||
set_signal_to_default (SIGINT);
|
||||
set_signal_to_default (SIGPIPE);
|
||||
g_client = NULL;
|
||||
|
||||
if (n <= -1)
|
||||
{
|
||||
hcl_client_logbfmt (client, HCL_LOG_APP | HCL_LOG_FATAL, "client error[%d] - %js\n", hcl_client_geterrnum(client), hcl_client_geterrmsg(client));
|
||||
}
|
||||
|
||||
if (xtn->logfd >= 0)
|
||||
{
|
||||
close (xtn->logfd);
|
||||
|
Reference in New Issue
Block a user