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 <[email protected] > <javascript:>> 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, ¢ral_dest); >> printf("CONNECT TO CENTRAL\n"); >> uv_tcp_connect(connect, socket_central, (const struct >> sockaddr*)¢ral_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 [email protected] <javascript:>. >> 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 [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/libuv/f46dd23f-e7f4-462d-aa9c-95e012ee7951o%40googlegroups.com.
