I am a bit confused about your description how the flow of messages between client and server works. It seems like the client is trying to act as a server once the first request has been sent, which I would expect would confuse any standard HTTP server. Should the client not instead send a new request containing the heartbeat acknowledgement instead of a HTTP response?
Christian On Fri, Dec 10, 2010 at 5:18 PM, Zulfiqer Sekender <[email protected]> wrote: > Hi, > > I have to develop a simple http client which can communicate with a http > server. The client is sending evhttp_make_request(). The server sends "HT:" > heartbeat in response after certain time and when the client gets "HT:" each > time it will send "HA:" as heartbeat acknowledgement. Transfering of "HT:" & > "HA:" should go on. > > I developed the following client program. It gets "HT:" and tries to send > back "HA:". But server never gets the "HA:". > > I will highly appreciate any help regarding this. Please, let me know what > wrong I am doing and how to do it correctly. (Intentionally I left few > commented out lines to show what else options I tried.) > > Please, please help me. > > Thanks. > > Here is the code: > > > > #include <sys/types.h> > > #include <sys/time.h> > > #include <sys/queue.h> > > #include <stdlib.h> > > //#include <err.h> > > #include <event.h> > > #include <evhttp.h> > > #include <unistd.h> > > #include <stdio.h> > > #include <sys/socket.h> > > #include <netinet/in.h> > > #include <time.h> > > #include <pthread.h> > > #include <string.h> > > > > #define BUFSIZE 4096 > > #define SERVERADDR "15.172.175.61" > > #define SERVERPORT 8070 > > #define SLEEP_MS 10 > > > > char buf[BUFSIZE]; > > > > int bytes_recvd = 0; > > int chunks_recvd = 0; > > int closed = 0; > > int connected = 0; > > > > // called per chunk received > > void chunkcb(struct evhttp_request * req, void * arg) > > { > > int s = evbuffer_remove( req->input_buffer, &buf, BUFSIZE ); > > printf("Read %d bytes: %s\n", s, &buf); > > bytes_recvd += s; > > chunks_recvd++; > > if (strcmp(buf,"HT:") == 0) > > { > > struct evbuffer *evbuff = NULL; > > evbuff = evbuffer_new(); > > evbuffer_add_printf(evbuff,"HA:"); > > evbuffer_add_printf(req->output_buffer,"HA:"); > > // evhttp_send_reply_start(req, HTTP_OK, "Start"); > > evhttp_send_reply_chunk(req, evbuff); > > // evhttp_send_reply_chunk(req,"3/r/nHA:/r/n"); > > // evhttp_send_reply(req, HTTP_OK, "", evbuff); > > // evhttp_send_reply(req, HTTP_OK, "Response","3/r/nHA:/r/n" ); > > // evhttp_send_reply(req, HTTP_OK, "Response",NULL); > > // evhttp_send_reply_end(req); > > evbuffer_free(evbuff); > > } > > } > > > > // gets called when request completes > > void reqcb(struct evhttp_request * req, void * arg) > > { > > closed++; > > printf("\nClosed.\n"); > > } > > > > int main(int argc, char **argv) > > { > > event_init(); > > struct evhttp *evhttp_connection; > > struct evhttp_request *evhttp_request; > > char addr[16]; > > char path[3200]; // eg: "/test/123" > > sprintf(&addr, "12.176.173.18"); > > evhttp_connection = evhttp_connection_new(SERVERADDR, SERVERPORT); > > if (evhttp_connection == NULL) > > { > > printf("New connection failed\n"); > > break; > > } > > evhttp_connection_set_local_address(evhttp_connection, &addr); > > evhttp_set_timeout(evhttp_connection, 864000); // 10 day timeout > > evhttp_request = evhttp_request_new(reqcb, NULL); > > evhttp_request->chunk_cb = chunkcb; > > evhttp_request->chunked = 1; // Chunked > > evhttp_add_header(evhttp_request->output_headers, "Transfer-Encoding", > "chunked"); > > sprintf(&path, "/test/123"); > > evhttp_make_request( evhttp_connection, evhttp_request, EVHTTP_REQ_POST, > path ); > > evhttp_connection_set_timeout(evhttp_request->evcon, 864000); > > event_loop( EVLOOP_NONBLOCK ); > > usleep(SLEEP_MS*1000); > > event_dispatch(); > > return 0; > > } > > > > > *********************************************************************** To unsubscribe, send an e-mail to [email protected] with unsubscribe libevent-users in the body.
