[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
Re: [Libevent-users] How http client can send back message to server?
- To: libevent-users@xxxxxxxxxxxxx
- Subject: Re: [Libevent-users] How http client can send back message to server?
- From: Christian Dahlqvist <acdahlqvist@xxxxxxxxx>
- Date: Sat, 11 Dec 2010 14:19:22 +0000
- Delivered-to: archiver@xxxxxxxx
- Delivered-to: libevent-users-outgoing@xxxxxxxx
- Delivered-to: libevent-users@xxxxxxxx
- Delivery-date: Sat, 11 Dec 2010 09:19:28 -0500
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:content-type :content-transfer-encoding; bh=5QgFxl6JHDPiOn+SUsZcm0vFPaxVp+T21rlRXYbjnZA=; b=GPGylCUPnySgjCOZ/hV7necZ8Yd33iaVGosy24loMTtLSO99qVcFme34UVMhito9Ho AvVS8YXV0s8ACgTtyhVwRjSqAsqLiGpSuyNy61y90lOSAU1IhyTpYz1+KthNHUygtEva a6n5is8IS4XmJ5pFIwHpYWbYDdaPBaEM0bHCE=
- Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type:content-transfer-encoding; b=Y/2+hRhD/wPf53cSJnEyJTy8ioUHxks3UZQi8oK/wHTsdCNTJYlpLYchpyJQPYHisO FrkJ0AZZPzwxXCj0mQyFODf3goYIsM7gL1dS7IeKG+azKTVn3f9ClhPOlZL6Qefg5nCc 9Kn4KOfkn3TCE1ka10FLrQzaipIPzpoRfbsiI=
- In-reply-to: <960272.74967.qm@xxxxxxxxxxxxxxxxxxxxxxxxxxxx>
- References: <960272.74967.qm@xxxxxxxxxxxxxxxxxxxxxxxxxxxx>
- Reply-to: libevent-users@xxxxxxxxxxxxx
- Sender: owner-libevent-users@xxxxxxxxxxxxx
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 <zulfiqers@xxxxxxxxx> 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 majordomo@xxxxxxxxxxxxx with
unsubscribe libevent-users in the body.