<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Jan 5, 2016 at 12:15 PM, Xiangrong Fang <span dir="ltr"><<a href="mailto:xrfang@gmail.com" target="_blank">xrfang@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div style="font-family:monospace,monospace;font-size:large">Hi All,</div><div style="font-family:monospace,monospace;font-size:large"><br></div><div style="font-family:monospace,monospace;font-size:large">Could anyone help me with some samples of writing socket program with libevent, or is there any adapter/wrapper already exists for freepascal?</div></div></blockquote></div><div class="gmail_extra"><br></div><div class="gmail_extra">I used libevent in a C project, but you can use it easily with Pascal (FPC and/or Delphi). For example, I did this small draft [1] that compiles in Free Pascal (it is just a helloworld fast HTTP server), using the libevent 2.0.5:</div><div class="gmail_extra"><br></div><div class="gmail_extra">=== begin code ===<br></div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra">program helloworld;</div><div class="gmail_extra"><br></div><div class="gmail_extra">{$mode objfpc}{$H+}</div><div class="gmail_extra"><br></div><div class="gmail_extra">uses</div><div class="gmail_extra">{$IFDEF MSWINDOWS}</div><div class="gmail_extra">  WinSock2,</div><div class="gmail_extra">{$ENDIF}</div><div class="gmail_extra">  ctypes;</div><div class="gmail_extra"><br></div><div class="gmail_extra">const</div><div class="gmail_extra">  EV_LIB_NAME = {$IFDEF MSWINDOWS}'libevent-2-0-5'{$ELSE}'event'{$ENDIF};</div><div class="gmail_extra"><br></div><div class="gmail_extra">{$IFDEF FPC}</div><div class="gmail_extra">  {$PACKRECORDS C}</div><div class="gmail_extra">{$ENDIF}</div><div class="gmail_extra"><br></div><div class="gmail_extra">const</div><div class="gmail_extra">  HTTP_OK = 200;</div><div class="gmail_extra"><br></div><div class="gmail_extra">type</div><div class="gmail_extra">  pcchar = PAnsiChar;</div><div class="gmail_extra"><br></div><div class="gmail_extra">  evbuffer = packed record</div><div class="gmail_extra">  end;</div><div class="gmail_extra">  Pevbuffer = ^evbuffer;</div><div class="gmail_extra"><br></div><div class="gmail_extra">  event_base = packed record</div><div class="gmail_extra">  end;</div><div class="gmail_extra">  Pevent_base = ^event_base;</div><div class="gmail_extra"><br></div><div class="gmail_extra">  evhttp = packed record</div><div class="gmail_extra">  end;</div><div class="gmail_extra">  Pevhttp = ^evhttp;</div><div class="gmail_extra"><br></div><div class="gmail_extra">  evhttp_request = packed record</div><div class="gmail_extra">  end;</div><div class="gmail_extra">  Pevhttp_request = ^evhttp_request;</div><div class="gmail_extra"><br></div><div class="gmail_extra">  evkeyvalq = packed record</div><div class="gmail_extra">  end;</div><div class="gmail_extra">  Pevkeyvalq = ^evkeyvalq;</div><div class="gmail_extra"><br></div><div class="gmail_extra">  evhttp_set_gencb_cb = procedure(p1: Pevhttp_request; p2: Pointer); cdecl;</div><div class="gmail_extra"><br></div><div class="gmail_extra">  function evbuffer_add_printf(buf: Pevbuffer; fmt: pcchar): cint; cdecl; varargs; external EV_LIB_NAME name 'evbuffer_add_printf';</div><div class="gmail_extra">  function event_init: pevent_base; cdecl; external EV_LIB_NAME name 'event_init';</div><div class="gmail_extra">  function event_dispatch: cint; cdecl; external EV_LIB_NAME name 'event_dispatch';</div><div class="gmail_extra">  function evhttp_start(address: pcchar;  port: cshort): pevhttp; cdecl; external EV_LIB_NAME name 'evhttp_start';</div><div class="gmail_extra">  function evbuffer_new: Pevbuffer; cdecl; external EV_LIB_NAME name 'evbuffer_new';</div><div class="gmail_extra">  procedure evhttp_set_gencb(http: Pevhttp; cb: evhttp_set_gencb_cb; arg: Pointer); cdecl; external EV_LIB_NAME name 'evhttp_set_gencb';</div><div class="gmail_extra">  function evhttp_add_header(headers: Pevkeyvalq; key: pcchar; value: pcchar): cint; cdecl; external EV_LIB_NAME name 'evhttp_add_header';</div><div class="gmail_extra">  function evhttp_request_get_output_headers(req: Pevhttp_request): Pevkeyvalq; cdecl; external EV_LIB_NAME name 'evhttp_request_get_output_headers';</div><div class="gmail_extra">  procedure evhttp_send_reply_start(req: Pevhttp_request; code: cint; reason: pcchar); cdecl; external EV_LIB_NAME name 'evhttp_send_reply_start';</div><div class="gmail_extra">  procedure evhttp_send_reply_chunk(req: Pevhttp_request; databuf: Pevbuffer); cdecl; external EV_LIB_NAME name 'evhttp_send_reply_chunk';</div><div class="gmail_extra">  procedure evhttp_send_reply_end(req: Pevhttp_request); cdecl; external EV_LIB_NAME name 'evhttp_send_reply_end';</div><div class="gmail_extra">  procedure evbuffer_free(buf: Pevbuffer); cdecl; external EV_LIB_NAME name 'evbuffer_free';</div><div class="gmail_extra"><br></div><div class="gmail_extra">  procedure generic_request_handler(req: Pevhttp_request; arg: Pointer); cdecl;</div><div class="gmail_extra">  var</div><div class="gmail_extra">    returnbuffer: Pevbuffer;</div><div class="gmail_extra">  begin</div><div class="gmail_extra">    returnbuffer := evbuffer_new;</div><div class="gmail_extra">    evhttp_add_header(evhttp_request_get_output_headers(req), 'Content-Type', 'text/html');</div><div class="gmail_extra">    evhttp_add_header(evhttp_request_get_output_headers(req), 'Connection', 'keep-alive');</div><div class="gmail_extra">    evbuffer_add_printf(returnbuffer, '<html><head><title>Hello world</title></head><body>Hello world</body></html>');</div><div class="gmail_extra">    evhttp_send_reply_start(req, HTTP_OK, 'OK');</div><div class="gmail_extra">    // Chuncked reply</div><div class="gmail_extra">    evhttp_send_reply_chunk(req, returnbuffer);</div><div class="gmail_extra">    evhttp_send_reply_end(req);</div><div class="gmail_extra">    evbuffer_free(returnbuffer);</div><div class="gmail_extra">  end;</div><div class="gmail_extra"><br></div><div class="gmail_extra">var</div><div class="gmail_extra">  http_port: cshort = 8080;</div><div class="gmail_extra">  http_addr: pcchar = '0.0.0.0';</div><div class="gmail_extra">  http_server: Pevhttp = nil;</div><div class="gmail_extra">{$IFDEF MSWINDOWS}</div><div class="gmail_extra">  wsa_data: WSAData;</div><div class="gmail_extra">{$ENDIF}</div><div class="gmail_extra">begin</div><div class="gmail_extra">{$IFDEF MSWINDOWS}</div><div class="gmail_extra">  WSAStartup($0201, wsa_data);</div><div class="gmail_extra">{$ENDIF}</div><div class="gmail_extra">  event_init;</div><div class="gmail_extra">  http_server := evhttp_start(http_addr, http_port);</div><div class="gmail_extra">  evhttp_set_gencb(http_server, @generic_request_handler, nil); // Callback on event</div><div class="gmail_extra">  WriteLn('Server started on port ', http_port);</div><div class="gmail_extra">  WriteLn('Press [ENTER] to exit ...');<br></div><div class="gmail_extra">  event_dispatch;</div><div class="gmail_extra">end.</div><div class="gmail_extra"><br></div><div class="gmail_extra">=== end code ===</div></div><div class="gmail_extra"><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><div>Silvio Clécio</div></div></div>
</div></div>