In fact, you may not relay on other program's behavior. Your app must be
failed tolerant. So, after any event that may occur, check the status.

Suppose the connection get dropped by a wire disconnect....

Get ready for anything

On Wed, Jul 22, 2020, 20:09 Bill Engelke <engelk...@bellsouth.net> wrote:

> Thanks for the feedback.  A follow-up question:  My heartbeat runs only
> once a minute (or even less); if I would like to let the server close the
> connection each time (and re-establish it the next time), could I just let
> it close the connection, and not change that?
>
> On Tuesday, July 21, 2020 at 10:01:57 AM UTC-5, Reza Mahdi wrote:
>>
>> Well, you are using HTTP 1.0
>> In this version, after the server sends the response, it will close the
>> connection.
>> You may use HTTP 1.1 with "Connection: keep-alive" header, to signal the
>> server not to close the connection.
>>
>> On Tue, Jul 21, 2020, 19:24 Bill Engelke <enge...@bellsouth.net> wrote:
>>
>>> I need code that will send a "heartbeat" to a web service (say, once per
>>> minute), and receive a response. This works fine with a browser, so I know
>>> the server is reachable and responding correctly. I have tried a vast
>>> number of different ways of doing this using libuv and c code, and so far,
>>> partial success at best. I have been able to connect to the server and send
>>> a request; but only the first request would work, and further sends would
>>> not make it to the server.  In my most recent attempts, even the connection
>>> request stopped working. I don't know if the problem is my incorrect use of
>>> libuv, or something in the networking part that I don't understand.  I have
>>> put the code into a single app for testing below; can anyone offer any
>>> suggestions??
>>>
>>> ```
>>>
>>> #include <stdio.h>
>>> #include <stdlib.h>
>>> #include <uv.h>
>>> #include <string.h>
>>> #include <unistd.h>
>>>
>>> typedef struct {
>>>   uv_write_t req;
>>>   uv_buf_t buf;
>>>  } write_req_t;
>>>
>>> static uv_tcp_t* socket_central;
>>> static struct sockaddr_in central_dest;
>>>
>>> static void alloc_buffer(uv_handle_t* handle, size_t suggested_size,
>>> uv_buf_t* buf) {
>>>   buf->base = malloc(suggested_size);
>>>   buf->len = suggested_size;
>>> }
>>>
>>> uv_loop_t *loop;
>>>
>>> /////   Callback for after TCP stream is closed  //////////////////
>>> void on_close(uv_handle_t * handle)
>>>   {
>>>   printf("uv close triggered\n");
>>>   }
>>>
>>> // process response from central server
>>> void proc_central_response(uv_stream_t *central, ssize_t nread, const
>>> uv_buf_t *buf)
>>>   {
>>>   printf("RESPONSE from Central Control; nread=%li\n",nread);
>>>
>>> printf("---------------------------------------------------------------\n");
>>>   if (nread > 0) {
>>>     printf("buf='%s'\n",buf->base);
>>>
>>> printf("---------------------------------------------------------------\n");
>>>     }
>>>   if (nread < 0) {
>>>     if (nread != UV_EOF)
>>>           fprintf(stderr, "Read error %s\n", uv_err_name(nread));
>>>     free(buf->base);
>>>     uv_close((uv_handle_t*) central, on_close);
>>>     return;
>>>     }
>>>   //uv_close((uv_handle_t*) central, on_close);
>>>   free(buf->base);
>>>   return;
>>>   }
>>>
>>> // now connected; send http POST
>>> void on_central_connect(uv_connect_t* connection, int status)
>>>   {
>>>   uv_stream_t* stream;
>>>   uv_write_t write_req;
>>>   printf("Connected to Central Contro, status = %il\n",status);
>>>   if (status < 0) {
>>>      fprintf(stderr, "Error in in connecting to Central Control %s\n",
>>> uv_strerror(status));
>>>         // error!
>>>       return;
>>>     }
>>>   printf(" - - - - Connect to Central Control - - - ;\n");
>>>     // get the handle to the stream passed in connection
>>>   stream = connection->handle;
>>>
>>>     // make ready to receive response from Central
>>>   uv_read_start((uv_stream_t*) stream, alloc_buffer,
>>> proc_central_response);
>>>
>>>   // Now, prepare a heartbeat message to send to Central Control
>>>
>>>   struct timeval timeout;
>>>   char message[1024];
>>>   timeout.tv_sec = 10;  // if Central Host doesn't respond, we ignore
>>>   timeout.tv_usec = 0;  //  and will try again after the pause time
>>>   char tbuf[30];
>>>   struct timeval tv;
>>>   time_t curtime;
>>>
>>>   char mytoken[75];
>>>   strcpy(mytoken,"T12345XYZ");  // hard code this for now
>>>
>>>   gettimeofday(&tv, NULL);
>>>   curtime = tv.tv_sec;
>>>   strftime(tbuf, 30, "%m-%d-%Y-%T.",localtime(&curtime));
>>>   printf("Heartbeat TOD: '%s' %ld\n",tbuf,tv.tv_usec);
>>>   // write message to go to host
>>>   // message contains identity token and time stamp
>>>   sprintf(message,"POST /apikey/%s-%s HTTP/1.0\r\n\r\n",mytoken,tbuf);
>>>   uv_buf_t buf = uv_buf_init(message,strlen(message));
>>>   int r1 = uv_write(&write_req, stream, &buf, 1, NULL);
>>>   }
>>>
>>> void heartbeat(void *arg) {
>>>   while(1==1)
>>>   {
>>>   printf("alloc socket\n");
>>>   socket_central = (uv_tcp_t*)malloc(sizeof(uv_tcp_t));\
>>>   printf("tcp init\n");
>>>   uv_tcp_init(loop, socket_central);
>>>   printf("alloc connection\n");
>>>   uv_connect_t* connect = (uv_connect_t*)malloc(sizeof(uv_connect_t));
>>>   uv_ip4_addr("192.168.1.67", 4000, &central_dest);
>>>   printf("CONNECT TO CENTRAL\n");
>>>   uv_tcp_connect(connect, socket_central, (const struct
>>> sockaddr*)&central_dest, on_central_connect);
>>>   printf("CONNECTION REQUEST DONE\n");
>>>   printf("sleep start\n");
>>>   sleep(5);
>>>   printf("sleep done\n");
>>>   }
>>> }
>>>
>>> int main() {
>>>   printf("start\n");
>>>   loop = uv_default_loop();
>>>
>>>   printf("alloc socket\n");
>>>   socket_central = (uv_tcp_t*)malloc(sizeof(uv_tcp_t));\
>>>   printf("tcp init\n");
>>>   uv_tcp_init(loop, socket_central);
>>>
>>>   uv_thread_t hb_id;
>>>   printf("start thread\n");
>>>   uv_thread_create(&hb_id, heartbeat, NULL);
>>>   printf("past thread start\n");
>>>
>>>   uv_run(loop, UV_RUN_DEFAULT);
>>>
>>>   sleep(10);
>>>
>>>   printf("Now quitting.\n");
>>>
>>>   uv_loop_close(loop);
>>>   //free(loop);
>>>   return 0;
>>> }
>>> ```
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "libuv" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to li...@googlegroups.com.
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/libuv/08a1297f-db66-4f6c-9682-5fb3ca3aca27o%40googlegroups.com
>>> <https://groups.google.com/d/msgid/libuv/08a1297f-db66-4f6c-9682-5fb3ca3aca27o%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>> --
> You received this message because you are subscribed to the Google Groups
> "libuv" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to libuv+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/libuv/f46dd23f-e7f4-462d-aa9c-95e012ee7951o%40googlegroups.com
> <https://groups.google.com/d/msgid/libuv/f46dd23f-e7f4-462d-aa9c-95e012ee7951o%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"libuv" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to libuv+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/libuv/CAMLQwnn7mNLXiDX9koVMM4AbvMX8rMaGfkaxXpB4r%2BvaiYaaxQ%40mail.gmail.com.

Reply via email to